Package: imglab
imglabimglabis the official Python package to integrate with imglab services.Installation$pipinstallimglabPython compatibilityimglabhas been successfully tested with the following Python versions:3.11,3.10,3.9,3.8,3.7,3.6.Generating URLsYou can useimglab.urlfunction to generate imglab compatible URLs for your application.The easiest way to generate a URL is to specify the name of thesource, apathand requiredparameters:>>>importimglab>>>imglab.url("assets","image.jpeg",width=500,height=600)'https://assets.imglab-cdn.net/image.jpeg?width=500&height=600'>>>imglab.url("avatars","user-01.jpeg",width=300,height=300,mode="crop",crop="face",format="webp")'https://avatars.imglab-cdn.net/user-01.jpeg?width=300&height=300&mode=crop&crop=face&format=webp'If some specific settings are required for the source you can use an instance ofimglab.Sourceclass instead:>>>imglab.url(imglab.Source("assets"),"image.jpeg",width=500,height=600)'https://assets.imglab-cdn.net/image.jpeg?width=500&height=600'Using secure image sourcesFor sources that require signed URLs you can specifysecure_keyandsecure_saltattributes:>>>source=imglab.Source("assets",secure_key="55IX1RVlDHpgl/4D",secure_salt="ITvYA2lPfyz0w8/v")>>>imglab.url(source,"image.jpeg",width=500,height=600)'https://assets.imglab-cdn.net/image.jpeg?width=500&height=600&signature=16sKGTU_dgMVqzU1JUBfkkmUV3vCKoZFkwVBYiqnGZU'signaturequery parameter will be automatically generated and attached to the returned URL.Note:secure_keyandsecure_saltattributes are secrets that should not be added to a code repository. Please use environment vars or other secure method to use them in your application.Using HTTP instead of HTTPSIn the case that HTTP schema is required instead of HTTPS you can sethttpsattribute toFalsewhen creating the source:>>>imglab.url(imglab.Source("assets",https=False),"image.jpeg",width=500,height=600)'http://assets.imglab-cdn.net/image.jpeg?width=500&height=600'Note: HTTPS is the default and recommended way to generate URLs with imglab.Specifying parametersAny parameter from the imglab API can be used to generate URLs withimglab.urlmethod. For parameters that required dashes characters liketrim-coloryou can use regular underscore argument names liketrim_colorthose will be normalized in the URL generation to it's correct form:>>>imglab.url("assets","image.jpeg",trim="color",trim_color="black")'https://assets.imglab-cdn.net/image.jpeg?trim=color&trim-color=black'If necessary you can pass a dictionary instead of a list of keyword arguments, unpacking the dictionary with**operator:>>>imglab.url("assets","image.jpeg",**{"trim":"color","trim-color":"black"})'https://assets.imglab-cdn.net/image.jpeg?trim=color&trim-color=black'Specifying color parametersSome imglab parameters can receive a color as value. It is possible to specify these color values as strings:>>># Specifying a RGB color as string>>>imglab.url("assets","image.jpeg",width=500,height=600,mode="contain",background_color="255,0,0")'https://assets.imglab-cdn.net/image.jpeg?width=500&height=600&mode=contain&background-color=255%2C0%2C0'>>># Specifying a RGBA color as string>>>imglab.url("assets","image.jpeg",width=500,height=600,mode="contain",background_color="255,0,0,128")'https://assets.imglab-cdn.net/image.jpeg?width=500&height=600&mode=contain&background-color=255%2C0%2C0%2C128'>>># Specifying a named color as string>>>imglab.url("assets","image.jpeg",width=500,height=600,mode="contain",background_color="red")'https://assets.imglab-cdn.net/image.jpeg?width=500&height=600&mode=contain&background-color=red'>>># Specifying a hexadecimal color as string>>>imglab.url("assets","image.jpeg",width=500,height=600,mode="contain",background_color="F00")'https://assets.imglab-cdn.net/image.jpeg?width=500&height=600&mode=contain&background-color=F00'You can additionally useimglab.colorhelper to specify color values:>>>fromimglabimportcolor>>># Using color helper function for a RGB color>>>imglab.url("assets","image.jpeg",width=500,height=600,mode="contain",background_color=color(255,0,0))'https://assets.imglab-cdn.net/image.jpeg?width=500&height=600&mode=contain&background-color=255%2C0%2C0'>>># Using color helper function for a RGBA color>>>imglab.url("assets","image.jpeg",width=500,height=600,mode="contain",background_color=color(255,0,0,128))'https://assets.imglab-cdn.net/image.jpeg?width=500&height=600&mode=contain&background-color=255%2C0%2C0%2C128'>>># Using color helper function for a named color>>>imglab.url("assets","image.jpeg",width=500,height=600,mode="contain",background_color=color("red"))'https://assets.imglab-cdn.net/image.jpeg?width=500&height=600&mode=contain&background-color=red'Note: specify hexadecimal color values usingimglab.colorhelper function is not allowed. You can use strings instead.Specifying position parametersSome imglab parameters can receive a position as value. It is possible to specify these values using strings:>>># Specifying a horizontal and vertical position as string>>>imglab.url("assets","image.jpeg",width=500,height=500,mode="crop",crop="left,top")'https://assets.imglab-cdn.net/image.jpeg?width=500&height=500&mode=crop&crop=left%2Ctop'>>># Specifying a vertical and horizontal position as string>>>imglab.url("assets","image.jpeg",width=500,height=500,mode="crop",crop="top,left")'https://assets.imglab-cdn.net/image.jpeg?width=500&height=500&mode=crop&crop=top%2Cleft'>>># Specifying a position as string>>>imglab.url("assets","image.jpeg",width=500,height=500,mode="crop",crop="left")'https://assets.imglab-cdn.net/image.jpeg?width=500&height=500&mode=crop&crop=left'You can additionally useimglab.positionhelper function to specify position values:>>>fromimglabimportposition>>># Using position function helper for a horizontal and vertical position>>>imglab.url("assets","image.jpeg",width=500,height=500,mode="crop",crop=position("left","top"))'https://assets.imglab-cdn.net/image.jpeg?width=500&height=500&mode=crop&crop=left%2Ctop'>>># Using position function helper for a vertical and horizontal position>>>imglab.url("assets","image.jpeg",width=500,height=500,mode="crop",crop=position("top","left"))'https://assets.imglab-cdn.net/image.jpeg?width=500&height=500&mode=crop&crop=top%2Cleft'>>># Using position function helper for a single position>>>imglab.url("assets","image.jpeg",width=500,height=500,mode="crop",crop=position("left"))'https://assets.imglab-cdn.net/image.jpeg?width=500&height=500&mode=crop&crop=left'Specifying URL parametersSome imglab parameters can receive URLs as values. It is possible to specify these parameter values as strings:>>>imglab.url("assets","image.jpeg",width=500,height=600,watermark="logo.svg")'https://assets.imglab-cdn.net/image.jpeg?width=500&height=600&watermark=logo.svg'And even use parameters if required:>>>imglab.url("assets","image.jpeg",width=500,height=600,watermark="logo.svg?width=100&format=png")'https://assets.imglab-cdn.net/image.jpeg?width=500&height=600&watermark=logo.svg%3Fwidth%3D100%26format%3Dpng'Additionally you can use nestedimglab.urlcalls to specify these URL values:>>>imglab.url(..."assets",..."image.jpeg",...width=500,...height=600,...watermark=imglab.url("assets","logo.svg",width=100,format="png")...)'https://assets.imglab-cdn.net/image.jpeg?width=500&height=600&watermark=https%3A%2F%2Fassets.imglab-cdn.net%2Flogo.svg%3Fwidth%3D100%26format%3Dpng'If the resource is located in a different source we can specify it usingimglab.url:>>>imglab.url(..."assets",..."image.jpeg",...width=500,...height=600,...watermark=imglab.url("marketing","logo.svg",width=100,format="png")...)'https://assets.imglab-cdn.net/image.jpeg?width=500&height=600&watermark=https%3A%2F%2Fmarketing.imglab-cdn.net%2Flogo.svg%3Fwidth%3D100%26format%3Dpng'Using secure sources for URLs parameter values is possible too:>>>marketing=imglab.Source("marketing",secure_key="55IX1RVlDHpgl/4D",secure_salt="ITvYA2lPfyz0w8/v")>>>imglab.url(..."assets",..."image.jpeg",...width=500,...height=600,...watermark=imglab.url(marketing,"logo.svg",width=100,format="png")...)'https://assets.imglab-cdn.net/image.jpeg?width=500&height=600&watermark=https%3A%2F%2Fmarketing.imglab-cdn.net%2Flogo.svg%3Fwidth%3D100%26format%3Dpng%26signature%3DMd4V23DOkn5hHw_nAjkEG9lKHOZ8wjDBmYi2d5TCaCc'signaturequery parameter will be automatically generated and attached to the nested URL value.Specifying URLs with expiration timestampTheexpiresparameter allows you to specify a UNIX timestamp in seconds after which the request is expired.If adatetimeorstruct_timeinstance is specified as value toexpiresparameter it will be automatically converted to UNIX timestamp. In the following example, we specify an expiration time of one hour:importdatetimeexpires_at=datetime.datetime.utcnow()+datetime.timedelta(hours=1)imglab.url("assets","image.jpeg",width=500,expires=expires_at)Note: Theexpiresparameter should be used in conjunction with secure sources. Otherwise,expiresvalue could be tampered with.Generating URLs for on-premises imglab serverFor on-premises imglab server is possible to define custom sources pointing to your server location.https- abooleanvalue specifying if the source should use https or not (default:True)host- astringspecifying the host where the imglab server is located. (default:"imglab-cdn.net")port- anintegerspecifying a port where the imglab server is located. (default:None)subdomains- aboolvalue specifying if the source should be specified using subdomains instead of using the path. (default:True)If we have our on-premises imglab server athttp://my-company.com:8080with a source namedimageswe can use the following source settings to access alogo.pngimage:>>>source=imglab.Source("images",https=False,host="my-company.com",port=8080)>>>imglab.url(source,"logo.png",width=300,height=300,format="png")'http://images.my-company.com:8080/logo.png?width=300&height=300&format=png'It is possible to use secure sources too:>>>source=imglab.Source(..."images",...https=False,...host="my-company.com",...port=8080,...secure_key="55IX1RVlDHpgl/4D",...secure_salt="ITvYA2lPfyz0w8/v"...)>>>imglab.url(source,"logo.png",width=300,height=300,format="png")'http://images.my-company.com:8080/logo.png?width=300&height=300&format=png&signature=spnbiXwImfp6PpihAqVJenm0IGdC-h5inIhViYp4_TU'Using sources with disabled subdomainsIn the case that your on-premises imglab server is configured to use source names as paths instead of subdomains you can setsubdomainsattribute toFalse:>>>source=imglab.Source(..."images",...https=False,...host="my-company.com",...port=8080,...subdomains=False...)>>>imglab.url(source,"logo.png",width=300,height=300,format="png")'http://my-company.com:8080/images/logo.png?width=300&height=300&format=png'Generating srcsetsYou can useimglab.srcsetfunction to generate custom string values forsrcsetattributes, to be used for Web responsive images inside an<img>HTML element or picture<source>.This function works similarly to functionimglab.url, expecting the same parameters and values, except for some specific query parameters that have a special meaning and can receiverangeandlistas values.To learn more about responsive images and thesrcsetattribute, you can take a look to theMDN article about responsive images.Fixed sizeWhen enough information is provided about the image output size (usingwidthorheightparameters),imglab.srcsetfunction will generate URLs with a default sequence of device pixel ratios.For the following example we are specying a fixed value of500pixels forwidthparameter:>>>srcset=imglab.srcset("assets","image.jpeg",width=500)>>>print(srcset)https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=11x,https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=22x,https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=33x,https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=44x,https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=55x,https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=66xA very common practice consists in reducing the quality of images with high pixel density, decreasing the final file size. To achieve this you can optionally specify arangeobject forqualityparameter, gradually reducing the quality and file size while increasing the image size.In this example we are specifying a fixedwidthvalue of500pixels and aqualityrange between80and40:>>>srcset=imglab.srcset("assets","image.jpeg",width=500,quality=range(80,40))>>>print(srcset)https://assets.imglab-cdn.net/image.jpeg?width=500&quality=80&dpr=11x,https://assets.imglab-cdn.net/image.jpeg?width=500&quality=70&dpr=22x,https://assets.imglab-cdn.net/image.jpeg?width=500&quality=61&dpr=33x,https://assets.imglab-cdn.net/image.jpeg?width=500&quality=53&dpr=44x,https://assets.imglab-cdn.net/image.jpeg?width=500&quality=46&dpr=55x,https://assets.imglab-cdn.net/image.jpeg?width=500&quality=40&dpr=66xA customrangevalue can be set fordprparameter too, overriding the default sequence of generated dprs:>>>srcset=imglab.srcset("assets","image.jpeg",width=500,dpr=range(1,4))>>>print(srcset)https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=11x,https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=22x,https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=33x,https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=44xUsingrangevalues fordprandqualityparameters in the samesrcsetcall is also possible:>>>srcset=imglab.srcset("assets","image.jpeg",width=500,dpr=range(1,4),quality=range(80,40))>>>print(srcset)https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=1&quality=801x,https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=2&quality=632x,https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=3&quality=503x,https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=4&quality=404xIf necessary you can also use a list with explicit values fordprandquality:>>>srcset=imglab.srcset("assets","image.jpeg",width=500,dpr=[1,2,3],quality=[80,75,60])>>>print(srcset)https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=1&quality=801x,https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=2&quality=752x,https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=3&quality=603xOr even use a specificqualityvalue for all the URLs in the same srcset:>>>srcset=imglab.srcset("assets","image.jpeg",width=500,dpr=[1,2,3],quality=70)>>>print(srcset)https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=1&quality=701x,https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=2&quality=702x,https://assets.imglab-cdn.net/image.jpeg?width=500&dpr=3&quality=703xFluid widthWhen a specific sequence of width values are required you can userange,imglab.sequence, orlistvalues forwidthparameter.When arangevalue is used, aimglab.sequencewith a default size of 16 URLs will be generated inside the specified interval:>>>srcset=imglab.srcset("assets","image.jpeg",width=range(100,2000))>>>print(srcset)https://assets.imglab-cdn.net/image.jpeg?width=100100w,https://assets.imglab-cdn.net/image.jpeg?width=122122w,https://assets.imglab-cdn.net/image.jpeg?width=149149w,https://assets.imglab-cdn.net/image.jpeg?width=182182w,https://assets.imglab-cdn.net/image.jpeg?width=222222w,https://assets.imglab-cdn.net/image.jpeg?width=271271w,https://assets.imglab-cdn.net/image.jpeg?width=331331w,https://assets.imglab-cdn.net/image.jpeg?width=405405w,https://assets.imglab-cdn.net/image.jpeg?width=494494w,https://assets.imglab-cdn.net/image.jpeg?width=603603w,https://assets.imglab-cdn.net/image.jpeg?width=737737w,https://assets.imglab-cdn.net/image.jpeg?width=900900w,https://assets.imglab-cdn.net/image.jpeg?width=10991099w,https://assets.imglab-cdn.net/image.jpeg?width=13411341w,https://assets.imglab-cdn.net/image.jpeg?width=16381638w,https://assets.imglab-cdn.net/image.jpeg?width=20002000wIf required you can specify arangevalue forqualityparameter too:>>>srcset=imglab.srcset("assets","image.jpeg",width=range(100,2000),quality=range(80,40))>>>print(srcset)https://assets.imglab-cdn.net/image.jpeg?width=100&quality=80100w,https://assets.imglab-cdn.net/image.jpeg?width=122&quality=76122w,https://assets.imglab-cdn.net/image.jpeg?width=149&quality=73149w,https://assets.imglab-cdn.net/image.jpeg?width=182&quality=70182w,https://assets.imglab-cdn.net/image.jpeg?width=222&quality=66222w,https://assets.imglab-cdn.net/image.jpeg?width=271&quality=63271w,https://assets.imglab-cdn.net/image.jpeg?width=331&quality=61331w,https://assets.imglab-cdn.net/image.jpeg?width=405&quality=58405w,https://assets.imglab-cdn.net/image.jpeg?width=494&quality=55494w,https://assets.imglab-cdn.net/image.jpeg?width=603&quality=53603w,https://assets.imglab-cdn.net/image.jpeg?width=737&quality=50737w,https://assets.imglab-cdn.net/image.jpeg?width=900&quality=48900w,https://assets.imglab-cdn.net/image.jpeg?width=1099&quality=461099w,https://assets.imglab-cdn.net/image.jpeg?width=1341&quality=441341w,https://assets.imglab-cdn.net/image.jpeg?width=1638&quality=421638w,https://assets.imglab-cdn.net/image.jpeg?width=2000&quality=402000wIf you want to generate a sequence of numbers forwidthparameter with a specific number of URLs you can useimglab.sequencefunction helper:# You can import the function helper if necessary>>>fromimglabimportsequence# Generating a srcset string with a sequence of 5 URLs between 100 and 2000 pixels for width parameter>>>srcset=imglab.srcset("assets","image.jpeg",width=sequence(100,2000,5))>>>print(srcset)https://assets.imglab-cdn.net/image.jpeg?width=100100w,https://assets.imglab-cdn.net/image.jpeg?width=211211w,https://assets.imglab-cdn.net/image.jpeg?width=447447w,https://assets.imglab-cdn.net/image.jpeg?width=946946w,https://assets.imglab-cdn.net/image.jpeg?width=20002000wUsing a list with specific values will generate URLs only for those widths:>>>srcset=imglab.srcset("assets","image.jpeg",width=[100,300,500])>>>print(srcset)https://assets.imglab-cdn.net/image.jpeg?width=100100w,https://assets.imglab-cdn.net/image.jpeg?width=300300w,https://assets.imglab-cdn.net/image.jpeg?width=500500wIt is also possible to specify a list of values forheightandqualityparameters:>>>srcset=imglab.srcset("assets","image.jpeg",width=[100,300,500],height=[200,400,600],quality=[75,70,65])>>>print(srcset)https://assets.imglab-cdn.net/image.jpeg?width=100&height=200&quality=75100w,https://assets.imglab-cdn.net/image.jpeg?width=300&height=400&quality=70300w,https://assets.imglab-cdn.net/image.jpeg?width=500&height=600&quality=65500wNo sizeWhensrcsetfunction doesn't have information about the image output size (widthorheightparameters are not set) it will generate a defaultimglab.sequenceof 16 URLs specifying awidthvalue with an interval between100and8192pixels:>>>srcset=imglab.srcset("assets","image.jpeg")>>>print(srcset)https://assets.imglab-cdn.net/image.jpeg?width=100100w,https://assets.imglab-cdn.net/image.jpeg?width=134134w,https://assets.imglab-cdn.net/image.jpeg?width=180180w,https://assets.imglab-cdn.net/image.jpeg?width=241241w,https://assets.imglab-cdn.net/image.jpeg?width=324324w,https://assets.imglab-cdn.net/image.jpeg?width=434434w,https://assets.imglab-cdn.net/image.jpeg?width=583583w,https://assets.imglab-cdn.net/image.jpeg?width=781781w,https://assets.imglab-cdn.net/image.jpeg?width=10481048w,https://assets.imglab-cdn.net/image.jpeg?width=14061406w,https://assets.imglab-cdn.net/image.jpeg?width=18861886w,https://assets.imglab-cdn.net/image.jpeg?width=25302530w,https://assets.imglab-cdn.net/image.jpeg?width=33943394w,https://assets.imglab-cdn.net/image.jpeg?width=45534553w,https://assets.imglab-cdn.net/image.jpeg?width=61076107w,https://assets.imglab-cdn.net/image.jpeg?width=81928192wIt is always possible to change this default behavior usingimglab.sequencefunction helper. In the following example we are specifying a sequence of 10 different URLs between320and4096pixels:>>>fromimglabimportsequence>>>srcset=imglab.srcset("assets","image.jpeg",width=sequence(320,4096,10))>>>print(srcset)https://assets.imglab-cdn.net/image.jpeg?width=320320w,https://assets.imglab-cdn.net/image.jpeg?width=425425w,https://assets.imglab-cdn.net/image.jpeg?width=564564w,https://assets.imglab-cdn.net/image.jpeg?width=749749w,https://assets.imglab-cdn.net/image.jpeg?width=994994w,https://assets.imglab-cdn.net/image.jpeg?width=13191319w,https://assets.imglab-cdn.net/image.jpeg?width=17511751w,https://assets.imglab-cdn.net/image.jpeg?width=23242324w,https://assets.imglab-cdn.net/image.jpeg?width=30863086w,https://assets.imglab-cdn.net/image.jpeg?width=40964096wImage aspect ratio and srcsetA usual scenario is to generate multiple URLs while maintaining the same aspect ratio for all of them. If a specific image aspect ratio is required while usingsrcsetfunction you can set a value toaspect-ratioparameter along withmodeparameter usingcrop,contain,face, orforceresize modes.For the following example we are using a specific value of300pixels forwidth, and an aspect ratio of1:1(square), cropping the image withcropresize mode and setting output format towebp:>>>srcset=imglab.srcset("assets","image.jpeg",width=300,aspect_ratio="1:1",mode="crop",format="webp")>>>print(srcset)https://assets.imglab-cdn.net/image.jpeg?width=300&aspect-ratio=1%3A1&mode=crop&format=webp&dpr=11x,https://assets.imglab-cdn.net/image.jpeg?width=300&aspect-ratio=1%3A1&mode=crop&format=webp&dpr=22x,https://assets.imglab-cdn.net/image.jpeg?width=300&aspect-ratio=1%3A1&mode=crop&format=webp&dpr=33x,https://assets.imglab-cdn.net/image.jpeg?width=300&aspect-ratio=1%3A1&mode=crop&format=webp&dpr=44x,https://assets.imglab-cdn.net/image.jpeg?width=300&aspect-ratio=1%3A1&mode=crop&format=webp&dpr=55x,https://assets.imglab-cdn.net/image.jpeg?width=300&aspect-ratio=1%3A1&mode=crop&format=webp&dpr=66xYou can instead useheightvalue. In this example we are specifying a fixed value of300pixels forheightparameter, aaspect-ratioof16:9(widescreen) withcropresize mode, andwebpoutput format:>>>srcset=imglab.srcset("assets","image.jpeg",height=300,aspect_ratio="16:9",mode="crop",format="webp")>>>print(srcset)https://assets.imglab-cdn.net/image.jpeg?height=300&aspect-ratio=16%3A9&mode=crop&format=webp&dpr=11x,https://assets.imglab-cdn.net/image.jpeg?height=300&aspect-ratio=16%3A9&mode=crop&format=webp&dpr=22x,https://assets.imglab-cdn.net/image.jpeg?height=300&aspect-ratio=16%3A9&mode=crop&format=webp&dpr=33x,https://assets.imglab-cdn.net/image.jpeg?height=300&aspect-ratio=16%3A9&mode=crop&format=webp&dpr=44x,https://assets.imglab-cdn.net/image.jpeg?height=300&aspect-ratio=16%3A9&mode=crop&format=webp&dpr=55x,https://assets.imglab-cdn.net/image.jpeg?height=300&aspect-ratio=16%3A9&mode=crop&format=webp&dpr=66xYou can also use fluid values forwidthparameter while maintaining the same aspect ratio for all generated URLs. In this example, we are using arangevalue between100and4096forwidthparameter, a value of1:1foraspect-ratio,cropresize mode andwebpoutput format:>>>srcset=imglab.srcset("assets","image.jpeg",width=range(100,4096),aspect_ratio="1:1",mode="crop",format="webp")>>>print(srcset)https://assets.imglab-cdn.net/image.jpeg?width=100&aspect-ratio=1%3A1&mode=crop&format=webp100w,https://assets.imglab-cdn.net/image.jpeg?width=128&aspect-ratio=1%3A1&mode=crop&format=webp128w,https://assets.imglab-cdn.net/image.jpeg?width=164&aspect-ratio=1%3A1&mode=crop&format=webp164w,https://assets.imglab-cdn.net/image.jpeg?width=210&aspect-ratio=1%3A1&mode=crop&format=webp210w,https://assets.imglab-cdn.net/image.jpeg?width=269&aspect-ratio=1%3A1&mode=crop&format=webp269w,https://assets.imglab-cdn.net/image.jpeg?width=345&aspect-ratio=1%3A1&mode=crop&format=webp345w,https://assets.imglab-cdn.net/image.jpeg?width=442&aspect-ratio=1%3A1&mode=crop&format=webp442w,https://assets.imglab-cdn.net/image.jpeg?width=566&aspect-ratio=1%3A1&mode=crop&format=webp566w,https://assets.imglab-cdn.net/image.jpeg?width=724&aspect-ratio=1%3A1&mode=crop&format=webp724w,https://assets.imglab-cdn.net/image.jpeg?width=928&aspect-ratio=1%3A1&mode=crop&format=webp928w,https://assets.imglab-cdn.net/image.jpeg?width=1188&aspect-ratio=1%3A1&mode=crop&format=webp1188w,https://assets.imglab-cdn.net/image.jpeg?width=1522&aspect-ratio=1%3A1&mode=crop&format=webp1522w,https://assets.imglab-cdn.net/image.jpeg?width=1949&aspect-ratio=1%3A1&mode=crop&format=webp1949w,https://assets.imglab-cdn.net/image.jpeg?width=2497&aspect-ratio=1%3A1&mode=crop&format=webp2497w,https://assets.imglab-cdn.net/image.jpeg?width=3198&aspect-ratio=1%3A1&mode=crop&format=webp3198w,https://assets.imglab-cdn.net/image.jpeg?width=4096&aspect-ratio=1%3A1&mode=crop&format=webp4096wLicenseimglab source code is released underMIT License.