{"id":21428,"date":"2016-10-20T12:43:25","date_gmt":"2016-10-20T12:43:25","guid":{"rendered":"http:\/\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator"},"modified":"2024-06-01T15:07:39","modified_gmt":"2024-06-01T22:07:39","slug":"push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator","title":{"rendered":"Push-button Art Direction with Cloudinary\u2019s Responsive Image Breakpoints Generator"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p style=\"text-align: center;\"><em><strong>Note:<\/strong> this article was originally published in <a target=\"_blank\" rel=\"nofollow\" href=\"https:\/\/www.smashingmagazine.com\/2016\/09\/automating-art-direction-with-the-responsive-image-breakpoints-generator\/\">Smashing Magazine<\/a>.<\/em><\/p>\n<p>Four years ago, Jason Grigsby asked a <em>surprisingly<\/em> difficult question: <a href=\"https:\/\/cloudfour.com\/thinks\/how-do-you-pick-responsive-images-breakpoints\/\">How do you pick responsive images breakpoints?<\/a> A year later, he <a href=\"https:\/\/cloudfour.com\/thinks\/sensible-jumps-in-responsive-image-file-sizes\/\">had an answer<\/a>: ideally, we\u2019d set responsive image performance budgets to achieve \u201csensible jumps in file size\u201d. <a href=\"https:\/\/www.smashingmagazine.com\/2016\/01\/responsive-image-breakpoints-generation\/\">Cloudinary built a tool that implemented this idea<\/a>, and the response from the community was universal: \u201cGreat! Now \u2013 what else can it do?\u201d Today, we have an answer: art direction!<\/p>\n<p>Since its release earlier this year, the <a href=\"https:\/\/www.responsivebreakpoints.com\/\">Generator<\/a> has been turning high-res originals into responsive <code>&lt;img&gt;<\/code>s with sensible <code>srcset<\/code>s at the push of a button. Today, we\u2019re launching v2.0, which allows you to pair layout breakpoints with aspect ratios, and generate art-directed <code>&lt;picture&gt;<\/code> markup with smart-cropped image resources to match. <a href=\"https:\/\/www.responsivebreakpoints.com\/\">Check it out<\/a>, and read on.<\/p>\n<h2>Responsive image breakpoints: asked and answered<\/h2>\n<p>Why did we build this tool in the first place?<\/p>\n<p>\u201cResponsive images\u201d send different people different resources, each tailored to their particular context; a responsive image is an image that <strong>adapts<\/strong>. There are a number of different axes along which that adaptation can happen. Most of the time, most developers only need adaptive <strong>resolution<\/strong> \u2013 we want to send high resolution images to large viewports and\/or high-density displays, and lower-resolution images to everybody else. Jason\u2019s \u201cresponsive image breakpoints\u201d question concerns this sort of adaptation.<\/p>\n<p>When we\u2019re crafting images that adapt to fit variable resolutions, we need to generate a range of differently-sized resources. We need to pick a maximum resolution, a minimum resolution, and (here\u2019s the tricky bit) some sizes in between. The max and min can be figured out based on the page\u2019s layout and some reasonable assumptions about devices. But when developers began implementing responsive images, it wasn\u2019t at all clear how to size the in-betweens. Some people picked a <strong>fixed step size<\/strong> between image widths \u2013\n<img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/eric-cloudinary\/image\/upload\/w_700,f_auto,q_auto\/breakpoints-generator-v2\/breakpoints-constant-step-size.svg\" alt=\"Rectangles showing the relative dimensions of a group of srcset resources that use a fixed-step-size strategy.\" id=\"steps-fixed-size\" \/> <em>Rectangles showing the relative dimensions of a group of <code>srcset<\/code> resources that use a fixed-step-size strategy.<\/em><\/p>\n<p>others picked a <strong>fixed number of steps<\/strong>, and used it for every range \u2013<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/eric-cloudinary\/image\/upload\/breakpoints-generator-v2\/breakpoints-constant-number-of-steps.svg\" alt=\"Rectangles showing the relative dimensions of three groups of srcset resources that use a fixed-number-of-steps strategy.\" id=\"steps-fixed-number\" \/> <em>Rectangles showing the relative dimensions of three groups of <code>srcset<\/code> resources that use a fixed-number-of-steps strategy.<\/em><\/p>\n<p>some people picked <strong>common display widths:<\/strong><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/eric-cloudinary\/image\/upload\/breakpoints-generator-v2\/breakpoints-common-displays.svg\" alt=\"Rectangles showing the relative dimensions of a group of srcset resources scaled to common display widths: 300, 512, 600, 768, 800, 1024, 1200\" id=\"steps-common\" \/> <em>Rectangles showing the relative dimensions of a group of <code>srcset<\/code> resources scaled to common display widths.<\/em><\/p>\n<p>At the time, because I was lazy and didn\u2019t like managing many resources, I favored <strong>doubling:<\/strong><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/eric-cloudinary\/image\/upload\/breakpoints-generator-v2\/breakpoints-doubling.svg\" alt=\"Rectangles showing the relative dimensions of a group of srcset resources scaled using a doubling strategy.\" id=\"steps-doubling\" \/> <em>Rectangles showing the relative dimensions of a group of <code>srcset<\/code> resources scaled using a doubling strategy.<\/em><\/p>\n<p>All of these strategies are essentially arbitrary. Jason thought there had to be a better way. And eventually realized that we shouldn\u2019t be thinking about these steps in terms of <strong>pixels<\/strong> at all. We should be aiming for \u201csensible jumps in file size\u201d; <a href=\"https:\/\/cloudfour.com\/thinks\/sensible-jumps-in-responsive-image-file-sizes\/\">these steps should be defined in terms of <strong>bytes<\/strong><\/a>.<\/p>\n<p>For example, let\u2019s say we have the following two JPEGs:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/eric-cloudinary\/image\/upload\/w_300,f_auto,q_auto\/breakpoints-generator-v2\/bike-small.jpg\" alt=\"300 pixels wide (41 KB)\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"300\" height=\"200\"\/><\/p>\n<p><em>300 pixels wide (41 KB)<\/em><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/eric-cloudinary\/image\/upload\/w_700,f_auto,q_auto\/breakpoints-generator-v2\/bike-big.jpg\" alt=\"1200 pixels wide (336 KB)\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"700\" height=\"467\"\/><\/p>\n<p><em>1200 pixels wide (336 KB)<\/em><\/p>\n<p>The biggest reason we don\u2019t want to send the 1200-pixel-wide resource to someone who only needs the small one isn\u2019t the extra <strong>pixels<\/strong>, it\u2019s the extra 295 KB of useless data. But different images compress differently; while a complex photograph like this might increase precipitously in byte-size with every increase in pixel-size, a simple logo might not add much weight at all. For instance, <a target=\"_blank\" href =\"https:\/\/res.cloudinary.com\/eric-cloudinary\/image\/upload\/f_auto,q_auto\/breakpoints-generator-v2\/cloudinary-logo-big.png\">this 1000-pixel-wide PNG<\/a> is only 8 KB larger than <a target=\"_blank\" href=\"https:\/\/res.cloudinary.com\/eric-cloudinary\/image\/upload\/f_auto,q_auto\/breakpoints-generator-v2\/cloudinary-logo-small.png\">a 200-pixel-wide version<\/a>.<\/p>\n<p>Sadly, there weren\u2019t any readily-useable tools to generate images at target byte-sizes. And <strong>ideally<\/strong>, you\u2019d want something that could generate whole ranges of responsive image resources for you \u2014 not just one at a time. <a href=\"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions\">Cloudinary built that tool<\/a>!<\/p>\n<img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/eric-cloudinary\/image\/upload\/w_700,f_auto,q_auto\/breakpoints-generator-v2\/generator-screenshot.png\" alt=\"A screenshot of the Responsive Images Generator\" id=\"generator-screenshot\" \/>\n<p>And released it as a free, <a href=\"https:\/\/github.com\/cloudinary\/responsive_breakpoints_generator\">open source<\/a> web app.<\/p>\n<p>But the people wanted more\u2026<\/p>\n<h2>The next frontier? Automatic art-direction!<\/h2>\n<p>So: we built a solution to the the breakpoints problem. And in the process, built a tool that made generating <strong>resolution-adaptable<\/strong> images easy. Upload a high-resolution original; get back a fully-responsive <code>&lt;img&gt;<\/code> with sensible breakpoints and the resources to back it up.<\/p>\n<p>That basic workflow \u2013 upload an image, get back a <strong>responsive<\/strong> image \u2013 is appealing. We\u2019d been focusing on the breakpoints problem, but when we released our solution people were quick to ask \u2014 what else can it do?<\/p>\n<p>Remember when I said that resolution-based adaptation is what most developers need, most of the time? Sometimes, it\u2019s not enough. Sometimes, we want to adapt our images along an orthogonal axis: <a href=\"https:\/\/usecases.responsiveimages.org\/#art-direction\">art direction<\/a>.<\/p>\n<p>Any time we alter our images <strong>visually<\/strong> to fit a different context, we\u2019re \u201cart directing\u201d. A resolution-adaptable image will look identical everywhere \u2013 it only resizes. An art-directed image changes in visually-noticeable ways. Most of the time, that means cropping, either to fit a new layout, or to keep the most important bits of the image legible when it\u2019s viewed at small physical sizes.<\/p>\n<img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/eric-cloudinary\/image\/upload\/w_500,f_auto,q_auto\/breakpoints-generator-v2\/art-direction-example-image.jpg\" alt=\"On small screens, we want to zoom in on the image\u2019s subject\" id=\"art-direction-example-image\" \/> \n<p><em>On small screens, we want to zoom in on the image\u2019s subject.<\/em><\/p>\n<p>People asked us for automatic art direction.<\/p>\n<p>Which is a hard problem! It requires knowing what the \u201cmost important\u201d parts of the image are. Bits and bytes are easy enough to program around; computer vision and fuzzy notions of \u201cimportance\u201d are something else entirely.<\/p>\n<p>For instance, given this image\u2026<\/p>\n<p><cld-code-widget\n      class=\" c-code-widget\"\n      snippets=\"[{&quot;sdkId&quot;:&quot;nodejs&quot;,&quot;framework&quot;:&quot;nodejs&quot;,&quot;language&quot;:&quot;nodejs&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image(\\&quot;white_cat.jpg\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image(\\&quot;white_cat.jpg\\&quot;)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Node.js&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;react_2&quot;,&quot;framework&quot;:&quot;react_2&quot;,&quot;language&quot;:&quot;react&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;React&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/react&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;react&quot;,&quot;framework&quot;:&quot;react&quot;,&quot;language&quot;:&quot;react&quot;,&quot;rawCodeSnippet&quot;:&quot;&lt;Image publicId=\\&quot;white_cat.jpg\\&quot; &gt; &lt;\\\/Image&gt;&quot;,&quot;codeSnippet&quot;:&quot;&lt;Image publicId=\\&quot;white_cat.jpg\\&quot; &gt;\\n\\n&lt;\\\/Image&gt;&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;React&quot;,&quot;packageName&quot;:&quot;cloudinary-react&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;vue_2&quot;,&quot;framework&quot;:&quot;vue_2&quot;,&quot;language&quot;:&quot;vue&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Vue.js&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/vue&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;vue&quot;,&quot;framework&quot;:&quot;vue&quot;,&quot;language&quot;:&quot;vue&quot;,&quot;rawCodeSnippet&quot;:&quot;&lt;cld-image public-id=\\&quot;white_cat.jpg\\&quot; &gt; &lt;\\\/cld-image&gt;&quot;,&quot;codeSnippet&quot;:&quot;&lt;cld-image public-id=\\&quot;white_cat.jpg\\&quot; &gt;\\n\\n&lt;\\\/cld-image&gt;&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Vue.js&quot;,&quot;packageName&quot;:&quot;cloudinary-vue&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;angular_2&quot;,&quot;framework&quot;:&quot;angular_2&quot;,&quot;language&quot;:&quot;angular&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Angular&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/ng&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;angular&quot;,&quot;framework&quot;:&quot;angular&quot;,&quot;language&quot;:&quot;angular&quot;,&quot;rawCodeSnippet&quot;:&quot;&lt;cl-image public-id=\\&quot;white_cat.jpg\\&quot; &gt; &lt;\\\/cl-image&gt;&quot;,&quot;codeSnippet&quot;:&quot;&lt;cl-image public-id=\\&quot;white_cat.jpg\\&quot; &gt;\\n\\n&lt;\\\/cl-image&gt;&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Angular&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/angular-5.x&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;js_2&quot;,&quot;framework&quot;:&quot;js_2&quot;,&quot;language&quot;:&quot;js&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;JS&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/url-gen&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;js&quot;,&quot;framework&quot;:&quot;js&quot;,&quot;language&quot;:&quot;js&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.imageTag(&#039;white_cat.jpg&#039;).toHtml();&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.imageTag(&#039;white_cat.jpg&#039;).toHtml();&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;JS&quot;,&quot;packageName&quot;:&quot;cloudinary-core&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;python&quot;,&quot;framework&quot;:&quot;python&quot;,&quot;language&quot;:&quot;python&quot;,&quot;rawCodeSnippet&quot;:&quot;CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).image()&quot;,&quot;codeSnippet&quot;:&quot;CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).image()&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Python&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;php_2&quot;,&quot;framework&quot;:&quot;php_2&quot;,&quot;language&quot;:&quot;php&quot;,&quot;rawCodeSnippet&quot;:&quot;(new ImageTag(&#039;white_cat.jpg&#039;));&quot;,&quot;codeSnippet&quot;:&quot;(new ImageTag(&#039;white_cat.jpg&#039;));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;PHP&quot;,&quot;packageName&quot;:&quot;cloudinary_php&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;3.x&quot;},{&quot;sdkId&quot;:&quot;php&quot;,&quot;framework&quot;:&quot;php&quot;,&quot;language&quot;:&quot;php&quot;,&quot;rawCodeSnippet&quot;:&quot;cl_image_tag(\\&quot;white_cat.jpg\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;cl_image_tag(\\&quot;white_cat.jpg\\&quot;)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;PHP&quot;,&quot;packageName&quot;:&quot;cloudinary_php&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;java&quot;,&quot;framework&quot;:&quot;java&quot;,&quot;language&quot;:&quot;java&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.url().transformation(new Transformation().imageTag(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.url().transformation(new Transformation().imageTag(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Java&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;ruby&quot;,&quot;framework&quot;:&quot;ruby&quot;,&quot;language&quot;:&quot;ruby&quot;,&quot;rawCodeSnippet&quot;:&quot;cl_image_tag(\\&quot;white_cat.jpg\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;cl_image_tag(\\&quot;white_cat.jpg\\&quot;)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Ruby&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;csharp&quot;,&quot;framework&quot;:&quot;csharp&quot;,&quot;language&quot;:&quot;csharp&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.Api.UrlImgUp.BuildImageTag(\\&quot;white_cat.jpg\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.Api.UrlImgUp.BuildImageTag(\\&quot;white_cat.jpg\\&quot;)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;.NET&quot;,&quot;packageName&quot;:&quot;CloudinaryDotNet&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;dart&quot;,&quot;framework&quot;:&quot;dart&quot;,&quot;language&quot;:&quot;dart&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image(&#039;white_cat.jpg&#039;).transformation(Transformation());&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image(&#039;white_cat.jpg&#039;).transformation(Transformation());&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Dart&quot;,&quot;packageName&quot;:&quot;cloudinary_dart&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;swift&quot;,&quot;framework&quot;:&quot;swift&quot;,&quot;language&quot;:&quot;swift&quot;,&quot;rawCodeSnippet&quot;:&quot;imageView.cldSetImage(cloudinary.createUrl().generate(\\&quot;white_cat.jpg\\&quot;)!, cloudinary: cloudinary)&quot;,&quot;codeSnippet&quot;:&quot;imageView.cldSetImage(cloudinary.createUrl().generate(\\&quot;white_cat.jpg\\&quot;)!, cloudinary: cloudinary)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;iOS&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;5.x&quot;},{&quot;sdkId&quot;:&quot;android&quot;,&quot;framework&quot;:&quot;android&quot;,&quot;language&quot;:&quot;android&quot;,&quot;rawCodeSnippet&quot;:&quot;MediaManager.get().url().transformation(new Transformation().generate(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;codeSnippet&quot;:&quot;MediaManager.get().url().transformation(new Transformation().generate(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Android&quot;,&quot;packageName&quot;:&quot;cloudinary-android&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;3.x&quot;},{&quot;sdkId&quot;:&quot;flutter&quot;,&quot;framework&quot;:&quot;flutter&quot;,&quot;language&quot;:&quot;flutter&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image(&#039;white_cat.jpg&#039;).transformation(Transformation());&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image(&#039;white_cat.jpg&#039;).transformation(Transformation());&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Flutter&quot;,&quot;packageName&quot;:&quot;cloudinary_flutter&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;kotlin&quot;,&quot;framework&quot;:&quot;kotlin&quot;,&quot;language&quot;:&quot;kotlin&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image {\\n\\tpublicId(\\&quot;white_cat.jpg\\&quot;) \\n}.generate()&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image {\\n\\tpublicId(\\&quot;white_cat.jpg\\&quot;) \\n}.generate()&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Kotlin&quot;,&quot;packageName&quot;:&quot;kotlin-url-gen&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;jquery&quot;,&quot;framework&quot;:&quot;jquery&quot;,&quot;language&quot;:&quot;jquery&quot;,&quot;rawCodeSnippet&quot;:&quot;$.cloudinary.image(\\&quot;white_cat.jpg\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;$.cloudinary.image(\\&quot;white_cat.jpg\\&quot;)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;jQuery&quot;,&quot;packageName&quot;:&quot;cloudinary-jquery&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;react_native&quot;,&quot;framework&quot;:&quot;react_native&quot;,&quot;language&quot;:&quot;react_native&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;React Native&quot;,&quot;packageName&quot;:&quot;cloudinary-react-native&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;}]\"\n      parsed-url=\"{&quot;url&quot;:&quot;https:\\\/\\\/res.cloudinary.com\\\/demo\\\/image\\\/upload\\\/white_cat.jpg&quot;,&quot;cloud_name&quot;:&quot;demo&quot;,&quot;host&quot;:&quot;res.cloudinary.com&quot;,&quot;type&quot;:&quot;upload&quot;,&quot;resource_type&quot;:&quot;image&quot;,&quot;transformation&quot;:[],&quot;transformation_string&quot;:&quot;&quot;,&quot;url_suffix&quot;:&quot;&quot;,&quot;version&quot;:&quot;&quot;,&quot;secure&quot;:true,&quot;public_id&quot;:&quot;white_cat.jpg&quot;,&quot;extension&quot;:&quot;jpg&quot;,&quot;format&quot;:&quot;jpg&quot;,&quot;format_code&quot;:true,&quot;url_code&quot;:false,&quot;signature&quot;:&quot;&quot;,&quot;private_cdn&quot;:false,&quot;result_asset_type&quot;:&quot;image&quot;}\"\n      with-url=\"true\"\n    >\n      <span class=\"u-visually-hidden\">Loading code examples<\/span>\n    <\/cld-code-widget><a class=\"c-image-link\" href=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/white_cat.jpg\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/f_auto,q_auto,w_600\/white_cat.jpg\" alt=\"A white cat, off-center\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"600\" height=\"400\"\/><\/a><\/p>\n<p>\u2026a dumb algorithm might simply crop in on the center:<\/p>\n<p><cld-code-widget\n      class=\" c-code-widget\"\n      snippets=\"[{&quot;sdkId&quot;:&quot;nodejs&quot;,&quot;framework&quot;:&quot;nodejs&quot;,&quot;language&quot;:&quot;nodejs&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image(\\&quot;white_cat.jpg\\&quot;, {aspect_ratio: \\&quot;4:6\\&quot;, crop: \\&quot;fill\\&quot;})&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image(\\&quot;white_cat.jpg\\&quot;, {aspect_ratio: \\&quot;4:6\\&quot;, crop: \\&quot;fill\\&quot;})&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Node.js&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;react_2&quot;,&quot;framework&quot;:&quot;react_2&quot;,&quot;language&quot;:&quot;react&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(fill().aspectRatio(\\&quot;4:6\\&quot;));&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(fill().aspectRatio(\\&quot;4:6\\&quot;));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;React&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/react&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;react&quot;,&quot;framework&quot;:&quot;react&quot;,&quot;language&quot;:&quot;react&quot;,&quot;rawCodeSnippet&quot;:&quot;&lt;Image publicId=\\&quot;white_cat.jpg\\&quot; &gt; &lt;Transformation aspectRatio=\\&quot;4:6\\&quot; crop=\\&quot;fill\\&quot; \\\/&gt; &lt;\\\/Image&gt;&quot;,&quot;codeSnippet&quot;:&quot;&lt;Image publicId=\\&quot;white_cat.jpg\\&quot; &gt;\\n\\t&lt;Transformation aspectRatio=\\&quot;4:6\\&quot; crop=\\&quot;fill\\&quot; \\\/&gt;\\n&lt;\\\/Image&gt;&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;React&quot;,&quot;packageName&quot;:&quot;cloudinary-react&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;vue_2&quot;,&quot;framework&quot;:&quot;vue_2&quot;,&quot;language&quot;:&quot;vue&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(fill().aspectRatio(\\&quot;4:6\\&quot;));&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(fill().aspectRatio(\\&quot;4:6\\&quot;));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Vue.js&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/vue&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;vue&quot;,&quot;framework&quot;:&quot;vue&quot;,&quot;language&quot;:&quot;vue&quot;,&quot;rawCodeSnippet&quot;:&quot;&lt;cld-image public-id=\\&quot;white_cat.jpg\\&quot; &gt; &lt;cld-transformation aspect-ratio=\\&quot;4:6\\&quot; crop=\\&quot;fill\\&quot; \\\/&gt; &lt;\\\/cld-image&gt;&quot;,&quot;codeSnippet&quot;:&quot;&lt;cld-image public-id=\\&quot;white_cat.jpg\\&quot; &gt;\\n\\t&lt;cld-transformation aspect-ratio=\\&quot;4:6\\&quot; crop=\\&quot;fill\\&quot; \\\/&gt;\\n&lt;\\\/cld-image&gt;&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Vue.js&quot;,&quot;packageName&quot;:&quot;cloudinary-vue&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;angular_2&quot;,&quot;framework&quot;:&quot;angular_2&quot;,&quot;language&quot;:&quot;angular&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(fill().aspectRatio(\\&quot;4:6\\&quot;));&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(fill().aspectRatio(\\&quot;4:6\\&quot;));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Angular&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/ng&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;angular&quot;,&quot;framework&quot;:&quot;angular&quot;,&quot;language&quot;:&quot;angular&quot;,&quot;rawCodeSnippet&quot;:&quot;&lt;cl-image public-id=\\&quot;white_cat.jpg\\&quot; &gt; &lt;cl-transformation aspect-ratio=\\&quot;4:6\\&quot; crop=\\&quot;fill\\&quot;&gt; &lt;\\\/cl-transformation&gt; &lt;\\\/cl-image&gt;&quot;,&quot;codeSnippet&quot;:&quot;&lt;cl-image public-id=\\&quot;white_cat.jpg\\&quot; &gt;\\n\\t&lt;cl-transformation aspect-ratio=\\&quot;4:6\\&quot; crop=\\&quot;fill\\&quot;&gt;\\n\\t&lt;\\\/cl-transformation&gt;\\n&lt;\\\/cl-image&gt;&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Angular&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/angular-5.x&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;js_2&quot;,&quot;framework&quot;:&quot;js_2&quot;,&quot;language&quot;:&quot;js&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(fill().aspectRatio(\\&quot;4:6\\&quot;));&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(fill().aspectRatio(\\&quot;4:6\\&quot;));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;JS&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/url-gen&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;js&quot;,&quot;framework&quot;:&quot;js&quot;,&quot;language&quot;:&quot;js&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.imageTag(&#039;white_cat.jpg&#039;, {aspectRatio: \\&quot;4:6\\&quot;, crop: \\&quot;fill\\&quot;}).toHtml();&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.imageTag(&#039;white_cat.jpg&#039;, {aspectRatio: \\&quot;4:6\\&quot;, crop: \\&quot;fill\\&quot;}).toHtml();&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;JS&quot;,&quot;packageName&quot;:&quot;cloudinary-core&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;python&quot;,&quot;framework&quot;:&quot;python&quot;,&quot;language&quot;:&quot;python&quot;,&quot;rawCodeSnippet&quot;:&quot;CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).image(aspect_ratio=\\&quot;4:6\\&quot;, crop=\\&quot;fill\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).image(aspect_ratio=\\&quot;4:6\\&quot;, crop=\\&quot;fill\\&quot;)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Python&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;php_2&quot;,&quot;framework&quot;:&quot;php_2&quot;,&quot;language&quot;:&quot;php&quot;,&quot;rawCodeSnippet&quot;:&quot;(new ImageTag(&#039;white_cat.jpg&#039;))\\n\\t-&gt;resize(Resize::fill()-&gt;aspectRatio(\\&quot;4:6\\&quot;));&quot;,&quot;codeSnippet&quot;:&quot;(new ImageTag(&#039;white_cat.jpg&#039;))\\n\\t-&gt;resize(Resize::fill()-&gt;aspectRatio(\\&quot;4:6\\&quot;));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;PHP&quot;,&quot;packageName&quot;:&quot;cloudinary_php&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;3.x&quot;},{&quot;sdkId&quot;:&quot;php&quot;,&quot;framework&quot;:&quot;php&quot;,&quot;language&quot;:&quot;php&quot;,&quot;rawCodeSnippet&quot;:&quot;cl_image_tag(\\&quot;white_cat.jpg\\&quot;, array(\\&quot;aspect_ratio\\&quot;=&gt;\\&quot;4:6\\&quot;, \\&quot;crop\\&quot;=&gt;\\&quot;fill\\&quot;))&quot;,&quot;codeSnippet&quot;:&quot;cl_image_tag(\\&quot;white_cat.jpg\\&quot;, array(\\&quot;aspect_ratio\\&quot;=&gt;\\&quot;4:6\\&quot;, \\&quot;crop\\&quot;=&gt;\\&quot;fill\\&quot;))&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;PHP&quot;,&quot;packageName&quot;:&quot;cloudinary_php&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;java&quot;,&quot;framework&quot;:&quot;java&quot;,&quot;language&quot;:&quot;java&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.url().transformation(new Transformation().aspectRatio(\\&quot;4:6\\&quot;).crop(\\&quot;fill\\&quot;)).imageTag(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.url().transformation(new Transformation().aspectRatio(\\&quot;4:6\\&quot;).crop(\\&quot;fill\\&quot;)).imageTag(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Java&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;ruby&quot;,&quot;framework&quot;:&quot;ruby&quot;,&quot;language&quot;:&quot;ruby&quot;,&quot;rawCodeSnippet&quot;:&quot;cl_image_tag(\\&quot;white_cat.jpg\\&quot;, aspect_ratio: \\&quot;4:6\\&quot;, crop: \\&quot;fill\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;cl_image_tag(\\&quot;white_cat.jpg\\&quot;, aspect_ratio: \\&quot;4:6\\&quot;, crop: \\&quot;fill\\&quot;)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Ruby&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;csharp&quot;,&quot;framework&quot;:&quot;csharp&quot;,&quot;language&quot;:&quot;csharp&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.Api.UrlImgUp.Transform(new Transformation().AspectRatio(\\&quot;4:6\\&quot;).Crop(\\&quot;fill\\&quot;)).BuildImageTag(\\&quot;white_cat.jpg\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.Api.UrlImgUp.Transform(new Transformation().AspectRatio(\\&quot;4:6\\&quot;).Crop(\\&quot;fill\\&quot;)).BuildImageTag(\\&quot;white_cat.jpg\\&quot;)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;.NET&quot;,&quot;packageName&quot;:&quot;CloudinaryDotNet&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;dart&quot;,&quot;framework&quot;:&quot;dart&quot;,&quot;language&quot;:&quot;dart&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image(&#039;white_cat.jpg&#039;).transformation(Transformation()\\n\\t.resize(Resize.fill().aspectRatio(\\&quot;4:6\\&quot;)));&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image(&#039;white_cat.jpg&#039;).transformation(Transformation()\\n\\t.resize(Resize.fill().aspectRatio(\\&quot;4:6\\&quot;)));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Dart&quot;,&quot;packageName&quot;:&quot;cloudinary_dart&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;swift&quot;,&quot;framework&quot;:&quot;swift&quot;,&quot;language&quot;:&quot;swift&quot;,&quot;rawCodeSnippet&quot;:&quot;imageView.cldSetImage(cloudinary.createUrl().setTransformation(CLDTransformation().setAspectRatio(\\&quot;4:6\\&quot;).setCrop(\\&quot;fill\\&quot;)).generate(\\&quot;white_cat.jpg\\&quot;)!, cloudinary: cloudinary)&quot;,&quot;codeSnippet&quot;:&quot;imageView.cldSetImage(cloudinary.createUrl().setTransformation(CLDTransformation().setAspectRatio(\\&quot;4:6\\&quot;).setCrop(\\&quot;fill\\&quot;)).generate(\\&quot;white_cat.jpg\\&quot;)!, cloudinary: cloudinary)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;iOS&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;5.x&quot;},{&quot;sdkId&quot;:&quot;android&quot;,&quot;framework&quot;:&quot;android&quot;,&quot;language&quot;:&quot;android&quot;,&quot;rawCodeSnippet&quot;:&quot;MediaManager.get().url().transformation(new Transformation().aspectRatio(\\&quot;4:6\\&quot;).crop(\\&quot;fill\\&quot;)).generate(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;codeSnippet&quot;:&quot;MediaManager.get().url().transformation(new Transformation().aspectRatio(\\&quot;4:6\\&quot;).crop(\\&quot;fill\\&quot;)).generate(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Android&quot;,&quot;packageName&quot;:&quot;cloudinary-android&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;3.x&quot;},{&quot;sdkId&quot;:&quot;flutter&quot;,&quot;framework&quot;:&quot;flutter&quot;,&quot;language&quot;:&quot;flutter&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image(&#039;white_cat.jpg&#039;).transformation(Transformation()\\n\\t.resize(Resize.fill().aspectRatio(\\&quot;4:6\\&quot;)));&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image(&#039;white_cat.jpg&#039;).transformation(Transformation()\\n\\t.resize(Resize.fill().aspectRatio(\\&quot;4:6\\&quot;)));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Flutter&quot;,&quot;packageName&quot;:&quot;cloudinary_flutter&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;kotlin&quot;,&quot;framework&quot;:&quot;kotlin&quot;,&quot;language&quot;:&quot;kotlin&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image {\\n\\tpublicId(\\&quot;white_cat.jpg\\&quot;)\\n\\t resize(Resize.fill() { aspectRatio(\\&quot;4:6\\&quot;) }) \\n}.generate()&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image {\\n\\tpublicId(\\&quot;white_cat.jpg\\&quot;)\\n\\t resize(Resize.fill() { aspectRatio(\\&quot;4:6\\&quot;) }) \\n}.generate()&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Kotlin&quot;,&quot;packageName&quot;:&quot;kotlin-url-gen&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;jquery&quot;,&quot;framework&quot;:&quot;jquery&quot;,&quot;language&quot;:&quot;jquery&quot;,&quot;rawCodeSnippet&quot;:&quot;$.cloudinary.image(\\&quot;white_cat.jpg\\&quot;, {aspect_ratio: \\&quot;4:6\\&quot;, crop: \\&quot;fill\\&quot;})&quot;,&quot;codeSnippet&quot;:&quot;$.cloudinary.image(\\&quot;white_cat.jpg\\&quot;, {aspect_ratio: \\&quot;4:6\\&quot;, crop: \\&quot;fill\\&quot;})&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;jQuery&quot;,&quot;packageName&quot;:&quot;cloudinary-jquery&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;react_native&quot;,&quot;framework&quot;:&quot;react_native&quot;,&quot;language&quot;:&quot;react_native&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(fill().aspectRatio(\\&quot;4:6\\&quot;));&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(fill().aspectRatio(\\&quot;4:6\\&quot;));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;React Native&quot;,&quot;packageName&quot;:&quot;cloudinary-react-native&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;}]\"\n      parsed-url=\"{&quot;url&quot;:&quot;https:\\\/\\\/res.cloudinary.com\\\/demo\\\/image\\\/upload\\\/c_fill,ar_4:6\\\/white_cat.jpg&quot;,&quot;cloud_name&quot;:&quot;demo&quot;,&quot;host&quot;:&quot;res.cloudinary.com&quot;,&quot;type&quot;:&quot;upload&quot;,&quot;resource_type&quot;:&quot;image&quot;,&quot;transformation&quot;:[{&quot;crop_mode&quot;:&quot;fill&quot;,&quot;aspect_ratio&quot;:&quot;4:6&quot;}],&quot;transformation_string&quot;:&quot;c_fill,ar_4:6&quot;,&quot;url_suffix&quot;:&quot;&quot;,&quot;version&quot;:&quot;&quot;,&quot;secure&quot;:true,&quot;public_id&quot;:&quot;white_cat.jpg&quot;,&quot;extension&quot;:&quot;jpg&quot;,&quot;format&quot;:&quot;jpg&quot;,&quot;format_code&quot;:true,&quot;url_code&quot;:false,&quot;signature&quot;:&quot;&quot;,&quot;private_cdn&quot;:false,&quot;result_asset_type&quot;:&quot;image&quot;}\"\n      with-url=\"true\"\n    >\n      <span class=\"u-visually-hidden\">Loading code examples<\/span>\n    <\/cld-code-widget><a class=\"c-image-link\" href=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_fill,ar_4:6\/white_cat.jpg\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_fill,ar_4:6\/f_auto,q_auto,w_300\/white_cat.jpg\" alt=\"The subject of the image has been cropped out of the frame\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"300\" height=\"450\"\/><\/a><\/p>\n<p>What you need is an algorithm that can somehow \u201csee\u201d the cat, and intelligently crop in on it.<\/p>\n<p>It took us a few months, but we built this, too, and packaged it up as a feature available to all Cloudinary users: <a href=\"https:\/\/cloudinary.com\/blog\/new_ai_based_image_auto_crop_algorithm_sticks_to_the_subject\"><code>g_auto<\/code><\/a>.<\/p>\n<p>Here\u2019s how it works: when you specify that you want to crop your image with \u201cautomatic gravity\u201d, the image is run through a series of tests, including edge-detection, face-detection, and visual uniqueness. These different criteria are then all used to generate a heat-map of the \u201cmost important\u201d parts of the image.<\/p>\n<img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/eric-cloudinary\/image\/upload\/breakpoints-generator-v2\/white_cat_g_auto_heatmap.png\" alt=\"The master, rolled-up heatmap\" id=\"white-cat-g_auto-heatmap\" \/>\n<p><a target=\"_blank\" href =\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/white_cat_g_auto_tests.png\"><em>The master rolled-up heat map<\/em><\/a><\/p>\n<p>A frame with the new proportions is then rolled over the image, possible crops are scored, and a winner is chosen. Here\u2019s a visualization of the rolling frame algorithm (using a <a target=\"_blank\" href=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/mountain_scene_panoramic.jpg\">different source image<\/a>):<\/p>\n<figure>\n<video src=\"https:\/\/res.cloudinary.com\/eric-cloudinary\/video\/upload\/breakpoints-generator-v2\/g_autox5.mp4\" autoplay loop width=\"320\" height=\"240\" style=\"display: block; margin-left: auto; margin-right: auto;\"><\/video>\n<\/figure>\n<p><em>The rolling frame, visualized. Bluer squares mean higher scores; the green square is the current pick.<\/em><\/p>\n<p>The end result? Our cat, front and center:<\/p>\n<p><cld-code-widget\n      class=\" c-code-widget\"\n      snippets=\"[{&quot;sdkId&quot;:&quot;nodejs&quot;,&quot;framework&quot;:&quot;nodejs&quot;,&quot;language&quot;:&quot;nodejs&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image(\\&quot;white_cat.jpg\\&quot;, {aspect_ratio: \\&quot;4:6\\&quot;, gravity: \\&quot;auto\\&quot;, crop: \\&quot;fill\\&quot;})&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image(\\&quot;white_cat.jpg\\&quot;, {aspect_ratio: \\&quot;4:6\\&quot;, gravity: \\&quot;auto\\&quot;, crop: \\&quot;fill\\&quot;})&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Node.js&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;react_2&quot;,&quot;framework&quot;:&quot;react_2&quot;,&quot;language&quot;:&quot;react&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(\\n  fill()\\n    .aspectRatio(\\&quot;4:6\\&quot;)\\n    .gravity(autoGravity())\\n);&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(\\n  fill()\\n    .aspectRatio(\\&quot;4:6\\&quot;)\\n    .gravity(autoGravity())\\n);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;React&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/react&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;react&quot;,&quot;framework&quot;:&quot;react&quot;,&quot;language&quot;:&quot;react&quot;,&quot;rawCodeSnippet&quot;:&quot;&lt;Image publicId=\\&quot;white_cat.jpg\\&quot; &gt; &lt;Transformation aspectRatio=\\&quot;4:6\\&quot; gravity=\\&quot;auto\\&quot; crop=\\&quot;fill\\&quot; \\\/&gt; &lt;\\\/Image&gt;&quot;,&quot;codeSnippet&quot;:&quot;&lt;Image publicId=\\&quot;white_cat.jpg\\&quot; &gt;\\n\\t&lt;Transformation aspectRatio=\\&quot;4:6\\&quot; gravity=\\&quot;auto\\&quot; crop=\\&quot;fill\\&quot; \\\/&gt;\\n&lt;\\\/Image&gt;&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;React&quot;,&quot;packageName&quot;:&quot;cloudinary-react&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;vue_2&quot;,&quot;framework&quot;:&quot;vue_2&quot;,&quot;language&quot;:&quot;vue&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(\\n  fill()\\n    .aspectRatio(\\&quot;4:6\\&quot;)\\n    .gravity(autoGravity())\\n);&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(\\n  fill()\\n    .aspectRatio(\\&quot;4:6\\&quot;)\\n    .gravity(autoGravity())\\n);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Vue.js&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/vue&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;vue&quot;,&quot;framework&quot;:&quot;vue&quot;,&quot;language&quot;:&quot;vue&quot;,&quot;rawCodeSnippet&quot;:&quot;&lt;cld-image public-id=\\&quot;white_cat.jpg\\&quot; &gt; &lt;cld-transformation aspect-ratio=\\&quot;4:6\\&quot; gravity=\\&quot;auto\\&quot; crop=\\&quot;fill\\&quot; \\\/&gt; &lt;\\\/cld-image&gt;&quot;,&quot;codeSnippet&quot;:&quot;&lt;cld-image public-id=\\&quot;white_cat.jpg\\&quot; &gt;\\n\\t&lt;cld-transformation aspect-ratio=\\&quot;4:6\\&quot; gravity=\\&quot;auto\\&quot; crop=\\&quot;fill\\&quot; \\\/&gt;\\n&lt;\\\/cld-image&gt;&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Vue.js&quot;,&quot;packageName&quot;:&quot;cloudinary-vue&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;angular_2&quot;,&quot;framework&quot;:&quot;angular_2&quot;,&quot;language&quot;:&quot;angular&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(\\n  fill()\\n    .aspectRatio(\\&quot;4:6\\&quot;)\\n    .gravity(autoGravity())\\n);&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(\\n  fill()\\n    .aspectRatio(\\&quot;4:6\\&quot;)\\n    .gravity(autoGravity())\\n);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Angular&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/ng&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;angular&quot;,&quot;framework&quot;:&quot;angular&quot;,&quot;language&quot;:&quot;angular&quot;,&quot;rawCodeSnippet&quot;:&quot;&lt;cl-image public-id=\\&quot;white_cat.jpg\\&quot; &gt; &lt;cl-transformation aspect-ratio=\\&quot;4:6\\&quot; gravity=\\&quot;auto\\&quot; crop=\\&quot;fill\\&quot;&gt; &lt;\\\/cl-transformation&gt; &lt;\\\/cl-image&gt;&quot;,&quot;codeSnippet&quot;:&quot;&lt;cl-image public-id=\\&quot;white_cat.jpg\\&quot; &gt;\\n\\t&lt;cl-transformation aspect-ratio=\\&quot;4:6\\&quot; gravity=\\&quot;auto\\&quot; crop=\\&quot;fill\\&quot;&gt;\\n\\t&lt;\\\/cl-transformation&gt;\\n&lt;\\\/cl-image&gt;&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Angular&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/angular-5.x&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;js_2&quot;,&quot;framework&quot;:&quot;js_2&quot;,&quot;language&quot;:&quot;js&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(\\n  fill()\\n    .aspectRatio(\\&quot;4:6\\&quot;)\\n    .gravity(autoGravity())\\n);&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(\\n  fill()\\n    .aspectRatio(\\&quot;4:6\\&quot;)\\n    .gravity(autoGravity())\\n);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;JS&quot;,&quot;packageName&quot;:&quot;@cloudinary\\\/url-gen&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;js&quot;,&quot;framework&quot;:&quot;js&quot;,&quot;language&quot;:&quot;js&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.imageTag(&#039;white_cat.jpg&#039;, {aspectRatio: \\&quot;4:6\\&quot;, gravity: \\&quot;auto\\&quot;, crop: \\&quot;fill\\&quot;}).toHtml();&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.imageTag(&#039;white_cat.jpg&#039;, {aspectRatio: \\&quot;4:6\\&quot;, gravity: \\&quot;auto\\&quot;, crop: \\&quot;fill\\&quot;}).toHtml();&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;JS&quot;,&quot;packageName&quot;:&quot;cloudinary-core&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;python&quot;,&quot;framework&quot;:&quot;python&quot;,&quot;language&quot;:&quot;python&quot;,&quot;rawCodeSnippet&quot;:&quot;CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).image(aspect_ratio=\\&quot;4:6\\&quot;, gravity=\\&quot;auto\\&quot;, crop=\\&quot;fill\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).image(aspect_ratio=\\&quot;4:6\\&quot;, gravity=\\&quot;auto\\&quot;, crop=\\&quot;fill\\&quot;)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Python&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;php_2&quot;,&quot;framework&quot;:&quot;php_2&quot;,&quot;language&quot;:&quot;php&quot;,&quot;rawCodeSnippet&quot;:&quot;(new ImageTag(&#039;white_cat.jpg&#039;))\\n\\t-&gt;resize(Resize::fill()-&gt;aspectRatio(\\&quot;4:6\\&quot;)\\n\\t-&gt;gravity(\\n\\tGravity::autoGravity())\\n\\t);&quot;,&quot;codeSnippet&quot;:&quot;(new ImageTag(&#039;white_cat.jpg&#039;))\\n\\t-&gt;resize(Resize::fill()-&gt;aspectRatio(\\&quot;4:6\\&quot;)\\n\\t-&gt;gravity(\\n\\tGravity::autoGravity())\\n\\t);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;PHP&quot;,&quot;packageName&quot;:&quot;cloudinary_php&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;3.x&quot;},{&quot;sdkId&quot;:&quot;php&quot;,&quot;framework&quot;:&quot;php&quot;,&quot;language&quot;:&quot;php&quot;,&quot;rawCodeSnippet&quot;:&quot;cl_image_tag(\\&quot;white_cat.jpg\\&quot;, array(\\&quot;aspect_ratio\\&quot;=&gt;\\&quot;4:6\\&quot;, \\&quot;gravity\\&quot;=&gt;\\&quot;auto\\&quot;, \\&quot;crop\\&quot;=&gt;\\&quot;fill\\&quot;))&quot;,&quot;codeSnippet&quot;:&quot;cl_image_tag(\\&quot;white_cat.jpg\\&quot;, array(\\&quot;aspect_ratio\\&quot;=&gt;\\&quot;4:6\\&quot;, \\&quot;gravity\\&quot;=&gt;\\&quot;auto\\&quot;, \\&quot;crop\\&quot;=&gt;\\&quot;fill\\&quot;))&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;PHP&quot;,&quot;packageName&quot;:&quot;cloudinary_php&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;java&quot;,&quot;framework&quot;:&quot;java&quot;,&quot;language&quot;:&quot;java&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.url().transformation(new Transformation().aspectRatio(\\&quot;4:6\\&quot;).gravity(\\&quot;auto\\&quot;).crop(\\&quot;fill\\&quot;)).imageTag(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.url().transformation(new Transformation().aspectRatio(\\&quot;4:6\\&quot;).gravity(\\&quot;auto\\&quot;).crop(\\&quot;fill\\&quot;)).imageTag(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Java&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;ruby&quot;,&quot;framework&quot;:&quot;ruby&quot;,&quot;language&quot;:&quot;ruby&quot;,&quot;rawCodeSnippet&quot;:&quot;cl_image_tag(\\&quot;white_cat.jpg\\&quot;, aspect_ratio: \\&quot;4:6\\&quot;, gravity: \\&quot;auto\\&quot;, crop: \\&quot;fill\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;cl_image_tag(\\&quot;white_cat.jpg\\&quot;, aspect_ratio: \\&quot;4:6\\&quot;, gravity: \\&quot;auto\\&quot;, crop: \\&quot;fill\\&quot;)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Ruby&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;csharp&quot;,&quot;framework&quot;:&quot;csharp&quot;,&quot;language&quot;:&quot;csharp&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.Api.UrlImgUp.Transform(new Transformation().AspectRatio(\\&quot;4:6\\&quot;).Gravity(\\&quot;auto\\&quot;).Crop(\\&quot;fill\\&quot;)).BuildImageTag(\\&quot;white_cat.jpg\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.Api.UrlImgUp.Transform(new Transformation().AspectRatio(\\&quot;4:6\\&quot;).Gravity(\\&quot;auto\\&quot;).Crop(\\&quot;fill\\&quot;)).BuildImageTag(\\&quot;white_cat.jpg\\&quot;)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;.NET&quot;,&quot;packageName&quot;:&quot;CloudinaryDotNet&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;dart&quot;,&quot;framework&quot;:&quot;dart&quot;,&quot;language&quot;:&quot;dart&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image(&#039;white_cat.jpg&#039;).transformation(Transformation()\\n\\t.resize(Resize.fill().aspectRatio(\\&quot;4:6\\&quot;)\\n\\t.gravity(\\n\\tGravity.autoGravity())\\n\\t));&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image(&#039;white_cat.jpg&#039;).transformation(Transformation()\\n\\t.resize(Resize.fill().aspectRatio(\\&quot;4:6\\&quot;)\\n\\t.gravity(\\n\\tGravity.autoGravity())\\n\\t));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Dart&quot;,&quot;packageName&quot;:&quot;cloudinary_dart&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;swift&quot;,&quot;framework&quot;:&quot;swift&quot;,&quot;language&quot;:&quot;swift&quot;,&quot;rawCodeSnippet&quot;:&quot;imageView.cldSetImage(cloudinary.createUrl().setTransformation(CLDTransformation().setAspectRatio(\\&quot;4:6\\&quot;).setGravity(\\&quot;auto\\&quot;).setCrop(\\&quot;fill\\&quot;)).generate(\\&quot;white_cat.jpg\\&quot;)!, cloudinary: cloudinary)&quot;,&quot;codeSnippet&quot;:&quot;imageView.cldSetImage(cloudinary.createUrl().setTransformation(CLDTransformation().setAspectRatio(\\&quot;4:6\\&quot;).setGravity(\\&quot;auto\\&quot;).setCrop(\\&quot;fill\\&quot;)).generate(\\&quot;white_cat.jpg\\&quot;)!, cloudinary: cloudinary)&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;iOS&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;5.x&quot;},{&quot;sdkId&quot;:&quot;android&quot;,&quot;framework&quot;:&quot;android&quot;,&quot;language&quot;:&quot;android&quot;,&quot;rawCodeSnippet&quot;:&quot;MediaManager.get().url().transformation(new Transformation().aspectRatio(\\&quot;4:6\\&quot;).gravity(\\&quot;auto\\&quot;).crop(\\&quot;fill\\&quot;)).generate(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;codeSnippet&quot;:&quot;MediaManager.get().url().transformation(new Transformation().aspectRatio(\\&quot;4:6\\&quot;).gravity(\\&quot;auto\\&quot;).crop(\\&quot;fill\\&quot;)).generate(\\&quot;white_cat.jpg\\&quot;);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Android&quot;,&quot;packageName&quot;:&quot;cloudinary-android&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;3.x&quot;},{&quot;sdkId&quot;:&quot;flutter&quot;,&quot;framework&quot;:&quot;flutter&quot;,&quot;language&quot;:&quot;flutter&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image(&#039;white_cat.jpg&#039;).transformation(Transformation()\\n\\t.resize(Resize.fill().aspectRatio(\\&quot;4:6\\&quot;)\\n\\t.gravity(\\n\\tGravity.autoGravity())\\n\\t));&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image(&#039;white_cat.jpg&#039;).transformation(Transformation()\\n\\t.resize(Resize.fill().aspectRatio(\\&quot;4:6\\&quot;)\\n\\t.gravity(\\n\\tGravity.autoGravity())\\n\\t));&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Flutter&quot;,&quot;packageName&quot;:&quot;cloudinary_flutter&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;kotlin&quot;,&quot;framework&quot;:&quot;kotlin&quot;,&quot;language&quot;:&quot;kotlin&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.image {\\n\\tpublicId(\\&quot;white_cat.jpg\\&quot;)\\n\\t resize(Resize.fill() { aspectRatio(\\&quot;4:6\\&quot;)\\n\\t gravity(\\n\\tGravity.autoGravity())\\n\\t }) \\n}.generate()&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.image {\\n\\tpublicId(\\&quot;white_cat.jpg\\&quot;)\\n\\t resize(Resize.fill() { aspectRatio(\\&quot;4:6\\&quot;)\\n\\t gravity(\\n\\tGravity.autoGravity())\\n\\t }) \\n}.generate()&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Kotlin&quot;,&quot;packageName&quot;:&quot;kotlin-url-gen&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;},{&quot;sdkId&quot;:&quot;jquery&quot;,&quot;framework&quot;:&quot;jquery&quot;,&quot;language&quot;:&quot;jquery&quot;,&quot;rawCodeSnippet&quot;:&quot;$.cloudinary.image(\\&quot;white_cat.jpg\\&quot;, {aspect_ratio: \\&quot;4:6\\&quot;, gravity: \\&quot;auto\\&quot;, crop: \\&quot;fill\\&quot;})&quot;,&quot;codeSnippet&quot;:&quot;$.cloudinary.image(\\&quot;white_cat.jpg\\&quot;, {aspect_ratio: \\&quot;4:6\\&quot;, gravity: \\&quot;auto\\&quot;, crop: \\&quot;fill\\&quot;})&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;jQuery&quot;,&quot;packageName&quot;:&quot;cloudinary-jquery&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;},{&quot;sdkId&quot;:&quot;react_native&quot;,&quot;framework&quot;:&quot;react_native&quot;,&quot;language&quot;:&quot;react_native&quot;,&quot;rawCodeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(\\n  fill()\\n    .aspectRatio(\\&quot;4:6\\&quot;)\\n    .gravity(autoGravity())\\n);&quot;,&quot;codeSnippet&quot;:&quot;new CloudinaryImage(\\&quot;white_cat.jpg\\&quot;).resize(\\n  fill()\\n    .aspectRatio(\\&quot;4:6\\&quot;)\\n    .gravity(autoGravity())\\n);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;React Native&quot;,&quot;packageName&quot;:&quot;cloudinary-react-native&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;}]\"\n      parsed-url=\"{&quot;url&quot;:&quot;https:\\\/\\\/res.cloudinary.com\\\/demo\\\/image\\\/upload\\\/c_fill,ar_4:6,g_auto\\\/white_cat.jpg&quot;,&quot;cloud_name&quot;:&quot;demo&quot;,&quot;host&quot;:&quot;res.cloudinary.com&quot;,&quot;type&quot;:&quot;upload&quot;,&quot;resource_type&quot;:&quot;image&quot;,&quot;transformation&quot;:[{&quot;crop_mode&quot;:&quot;fill&quot;,&quot;aspect_ratio&quot;:&quot;4:6&quot;,&quot;gravity&quot;:&quot;auto&quot;}],&quot;transformation_string&quot;:&quot;c_fill,ar_4:6,g_auto&quot;,&quot;url_suffix&quot;:&quot;&quot;,&quot;version&quot;:&quot;&quot;,&quot;secure&quot;:true,&quot;public_id&quot;:&quot;white_cat.jpg&quot;,&quot;extension&quot;:&quot;jpg&quot;,&quot;format&quot;:&quot;jpg&quot;,&quot;format_code&quot;:true,&quot;url_code&quot;:false,&quot;signature&quot;:&quot;&quot;,&quot;private_cdn&quot;:false,&quot;result_asset_type&quot;:&quot;image&quot;}\"\n      with-url=\"true\"\n    >\n      <span class=\"u-visually-hidden\">Loading code examples<\/span>\n    <\/cld-code-widget><a class=\"c-image-link\" href=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_fill,ar_4:6,g_auto\/white_cat.jpg\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_fill,ar_4:6,g_auto\/f_auto,q_auto,w_300\/white_cat.jpg\" alt=\"The subject is now front and center\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"300\" height=\"450\"\/><\/a><\/p>\n<p>Neat!<\/p>\n<p>It was immediately obvious that we could and should use <code>g_auto<\/code>\u2019s smarts to add automatic art-direction to the Generator. After a few upgrades to the markup logic and some (surprisingly-tricky) UX decisions, we did it: <a href=\"https:\/\/www.responsivebreakpoints.com\/\">version 2 of the tool \u2014 now with art-direction \u2014 is live<\/a>.<\/p>\n<h2>Let\u2019s take a tour<\/h2>\n<p>How do you use the Responsive Image Breakpoints Generator?<\/p>\n<p>The workflow has been largely carried-over from the first version: upload an image (or pick one of our presets), and set your maximum\/minimum resolutions, a step size (in bytes!), and a maximum number of resources (alternatively, you can simply use our pretty-good-most-of-the-time defaults). Click \u201cgenerate\u201d, <strong>et voila!<\/strong> You\u2019ll get a visual representation of the resulting image\u2019s responsive breakpoints, some sample markup, and a big honkin\u2019 \u201cdownload images\u201d button.<\/p>\n<img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/eric-cloudinary\/image\/upload\/w_600,f_auto,q_auto\/breakpoints-generator-v2\/generator-screenshot-inputs.png\" alt=\"Screenshot of the tool\u2019s inputs\" id=\"generator-screenshot-inputs\" \/> \n<p><em>Screenshot of the tool\u2019s inputs<\/em><\/p>\n<img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/eric-cloudinary\/image\/upload\/w_600,f_auto,q_auto\/breakpoints-generator-v2\/generator-screenshot-outputs.png\" alt=\"Screenshot of the tool\u2019s outputs\" id=\"generator-screenshot-outputs\" \/> \n<p><em>Screenshot of the tool\u2019s outputs<\/em><\/p>\n<p>The new version has a new set of inputs, though, which enable art direction. They\u2019re off by default. Let\u2019s turn a couple of them on and regenerate, shall we?<\/p>\n<img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/eric-cloudinary\/image\/upload\/w_600,f_auto,q_auto\/breakpoints-generator-v2\/generator-screenshot-art-direction-inputs-selected.png\" alt=\"Screenshot of the art-direction inputs, with \u201cDesktop\u201d and \u201cSmartphone\u201d selected\" id=\"generator-screenshot-art-direction-inputs-selected\" \/> \n<p><em>Screenshot of the art-direction inputs, with \u201cDesktop\u201d and \u201cSmartphone\u201d selected<\/em><\/p>\n<p>The first output section is unchanged: it contains our \u201cdesktop\u201d (full) image, responsively-breakpointed to perfection. But below it there\u2019s a new section, which shows off our new, smartly-cropped image:<\/p>\n<img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/eric-cloudinary\/image\/upload\/w_600,f_auto,q_auto\/breakpoints-generator-v2\/generator-screenshot-square.png\" alt=\"Screenshot of the 1:1 Aspect Ratio section\" id=\"generator-screenshot-square\" \/> \n<p><em>Screenshot of the \u201c1:1 Aspect Ratio\u201d section<\/em><\/p>\n<p>And below <strong>that<\/strong>, we now have all of the markup we need for an art-directed <code>&lt;picture&gt;<\/code> element that switches between the two crops at a layout breakpoint.<\/p>\n<img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/eric-cloudinary\/image\/upload\/w_600,f_auto,q_auto\/breakpoints-generator-v2\/generator-screenshot-picture-markup.png\" alt=\"Screenshot of the picture markup section\" id=\"generator-screenshot-picture-markup\" \/> \n<p><em>Screenshot of the <picture> markup section<\/em><\/p>\n<p>Finally, there\u2019s a live <code>&lt;picture&gt;<\/code> example, which shows you what all of that markup actually <strong>does.<\/strong><\/p>\n<img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/eric-cloudinary\/image\/upload\/w_600,f_auto,q_auto\/breakpoints-generator-v2\/generator-screenshot-picture-markup.png\" alt=\"Screenshot of the Live Picture Element in Action section\" id=\"generator-screenshot-picture-markup\" \/> \n<p><em>Screenshot of the \u201cLive Picture Element in Action\u201d section<\/em><\/p>\n<p>Lets circle back and look at the art direction inputs in a little more detail.<\/p>\n<img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/eric-cloudinary\/image\/upload\/w_600,f_auto,q_auto\/breakpoints-generator-v2\/generator-screenshot-art-direction-inputs-annotated.png\" alt=\"Screenshot of the art direction inputs, annotated to point out what each thing does\" id=\"generator-screenshot-art-direction-inputs-annotated\" \/> \n<p><em>Screenshot of the art direction inputs, annotated to point out what each thing does<\/em><\/p>\n<p>Each big box maps to a device-type, and each device-type has been assigned a layout breakpoint. The text under the device-type name shows the specific media query that, when true, will trigger this crop.<\/p>\n<p>Below that, we can specify the aspect ratio we want to crop to on this device-type.<\/p>\n<p>Below <strong>that<\/strong>, we specify how wide the image will appear relative to the width of the viewport on this type of device. Will it take up the whole viewport (100%), or less than that? The tool uses this percentage to generate simple <a href=\"https:\/\/cloudfour.com\/thinks\/responsive-images-101-part-5-sizes\/\"><code>sizes<\/code><\/a> markup \u2013 which reflects\/specifies how large the image is on the layout. If you\u2019re using this code in production, you\u2019ll probably want to go back into the example markup and tailor these <code>sizes<\/code> values to match your particular layout more precisely. But depending on your layout, rough estimates, input here, might be good enough.<\/p>\n<p>And there you have it: simple, push-button art direction.<\/p>\n<h2>Automation<\/h2>\n<p>What if you want to work with more than one image at a time? If you\u2019re building entire sites, with hundreds, or thousands (or hundreds of thousands!) of images \u2013 especially if you\u2019re working with user-generated content \u2013 you\u2019ll want more than push-button ease; you\u2019ll need full automation. For that, there\u2019s Cloudinary\u2019s API, which you can use to call the smart-cropping and responsive image breakpoints functions that power the Generator, directly. With the API, you can create customized, optimized, and <strong>fully<\/strong>-automated responsive image workflows for projects of any shape or size.<\/p>\n<p>For instance, here\u2019s Ruby code that would upload an image to Cloudinary, smart-crop it to a 16:9 aspect ratio, and generate a set of downscaled-resources with sensible responsive image breakpoints:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\">\t<span class=\"hljs-selector-tag\">Cloudinary<\/span><span class=\"hljs-selector-pseudo\">::Uploader.upload(\"sample.jpg\"<\/span>,\n\t    <span class=\"hljs-selector-tag\">responsive_breakpoints<\/span>: { \n\t        <span class=\"hljs-attribute\">create_derived<\/span>: true,\n\t        bytes_step: <span class=\"hljs-number\">20000<\/span>,\n\t        min_width: <span class=\"hljs-number\">200<\/span>,\n\t        max_width: <span class=\"hljs-number\">1000<\/span>,\n\t        transformation: {\n\t            crop: :fill,\n\t            aspect_ratio: <span class=\"hljs-string\">\"16:9\"<\/span>,\n\t            gravity: :auto\n\t        }\n\t    }\n\t)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>If you\u2019re only working on the front end, all of this functionality is available via URL parameters, too! Here\u2019s a <a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#automatic_image_width\">Client-Hints<\/a>-and-<a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations#automatic_cropping\">smart-crop<\/a>-powered URL that does the same thing on <strong>download<\/strong> that the Ruby above does at <strong>upload<\/strong> \u2013 <strong>and<\/strong> delivers different, dynamically optimized resources to different devices, responsively:<\/p>\n<p><a href=\"https:\/\/demo-res.cloudinary.com\/c_fill,ar_16:9,g_auto,q_auto\/w_auto:breakpoints\/sample.jpg\">Auto breakpoints URL<\/a><\/p>\n<p>There\u2019s a tremendous amount of smarts packed into that little URL!<\/p>\n<h2>Final thoughts<\/h2>\n<p>But, back to the Generator. Now, it can do more than \u201cjust\u201d pick your image breakpoints \u2013 it can pick your art-directed crops too. And it will do all of the tedious resource-and-markup generation for you; upload one, high-res original, and get back all of the markup and down-scaled resources you need to include a scalable <strong>and<\/strong> art-directed image on your webpage.<\/p>\n<p>Have I mentioned that the Responsive Image Breakpoints Generator is free? And <a href=\"https:\/\/github.com\/cloudinary\/responsive_breakpoints_generator\">open source<\/a>? <a href=\"https:\/\/www.responsivebreakpoints.com\/\">Give it a whirl<\/a>, and please, send us feedback. Who knows, maybe we\u2019ll be back again soon with version 3!<\/p>\n<h2>Further Reading on Responsive Images<\/h2>\n<ul>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/make_all_images_on_your_website_responsive_in_3_easy_steps\">Responsive images with Cloudinary<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/introducing_smart_cropping_intelligent_quality_selection_and_automated_responsive_images\">Auto-Crop Images for Responsive Designs and Improved Image Quality<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/responsive_images_with_srcset_sizes_and_cloudinary\">Responsive Images: The srcset and sizes HTML Image Attributes<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/make_all_images_on_your_website_responsive_in_3_easy_steps\">Make All Images on Your Website Responsive in 3 Easy Steps<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/best_practices_for_responsive_web_design\">Best Practices for Responsive Web Design<\/a>\n<\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":21429,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[145,165,249,251],"class_list":["post-21428","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-html5","tag-image-transformation","tag-responsive","tag-responsive-images"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Using smart-cropping for automatic art direction<\/title>\n<meta name=\"description\" content=\"Introducing version 2 of the Responsive Image Breakpoints Generator \u2013 now featuring automatic picture element based art direction via smart cropping\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Push-button Art Direction with Cloudinary\u2019s Responsive Image Breakpoints Generator\" \/>\n<meta property=\"og:description\" content=\"Introducing version 2 of the Responsive Image Breakpoints Generator \u2013 now featuring automatic picture element based art direction via smart cropping\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-10-20T12:43:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-01T22:07:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649747346\/Web_Assets\/blog\/responsive-breakpoints-hero_2142989443\/responsive-breakpoints-hero_2142989443-jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1540\" \/>\n\t<meta property=\"og:image:height\" content=\"1027\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Push-button Art Direction with Cloudinary\u2019s Responsive Image Breakpoints Generator\",\"datePublished\":\"2016-10-20T12:43:25+00:00\",\"dateModified\":\"2024-06-01T22:07:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator\"},\"wordCount\":10,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649747346\/Web_Assets\/blog\/responsive-breakpoints-hero_2142989443\/responsive-breakpoints-hero_2142989443.jpg?_i=AA\",\"keywords\":[\"HTML5\",\"Image Transformation\",\"Responsive\",\"Responsive Images\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2016\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator\",\"url\":\"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator\",\"name\":\"Using smart-cropping for automatic art direction\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649747346\/Web_Assets\/blog\/responsive-breakpoints-hero_2142989443\/responsive-breakpoints-hero_2142989443.jpg?_i=AA\",\"datePublished\":\"2016-10-20T12:43:25+00:00\",\"dateModified\":\"2024-06-01T22:07:39+00:00\",\"description\":\"Introducing version 2 of the Responsive Image Breakpoints Generator \u2013 now featuring automatic picture element based art direction via smart cropping\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649747346\/Web_Assets\/blog\/responsive-breakpoints-hero_2142989443\/responsive-breakpoints-hero_2142989443.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649747346\/Web_Assets\/blog\/responsive-breakpoints-hero_2142989443\/responsive-breakpoints-hero_2142989443.jpg?_i=AA\",\"width\":1540,\"height\":1027},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Push-button Art Direction with Cloudinary\u2019s Responsive Image Breakpoints Generator\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Using smart-cropping for automatic art direction","description":"Introducing version 2 of the Responsive Image Breakpoints Generator \u2013 now featuring automatic picture element based art direction via smart cropping","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator","og_locale":"en_US","og_type":"article","og_title":"Push-button Art Direction with Cloudinary\u2019s Responsive Image Breakpoints Generator","og_description":"Introducing version 2 of the Responsive Image Breakpoints Generator \u2013 now featuring automatic picture element based art direction via smart cropping","og_url":"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator","og_site_name":"Cloudinary Blog","article_published_time":"2016-10-20T12:43:25+00:00","article_modified_time":"2024-06-01T22:07:39+00:00","og_image":[{"width":1540,"height":1027,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649747346\/Web_Assets\/blog\/responsive-breakpoints-hero_2142989443\/responsive-breakpoints-hero_2142989443-jpg?_i=AA","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator"},"author":{"name":"","@id":""},"headline":"Push-button Art Direction with Cloudinary\u2019s Responsive Image Breakpoints Generator","datePublished":"2016-10-20T12:43:25+00:00","dateModified":"2024-06-01T22:07:39+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator"},"wordCount":10,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649747346\/Web_Assets\/blog\/responsive-breakpoints-hero_2142989443\/responsive-breakpoints-hero_2142989443.jpg?_i=AA","keywords":["HTML5","Image Transformation","Responsive","Responsive Images"],"inLanguage":"en-US","copyrightYear":"2016","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator","url":"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator","name":"Using smart-cropping for automatic art direction","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649747346\/Web_Assets\/blog\/responsive-breakpoints-hero_2142989443\/responsive-breakpoints-hero_2142989443.jpg?_i=AA","datePublished":"2016-10-20T12:43:25+00:00","dateModified":"2024-06-01T22:07:39+00:00","description":"Introducing version 2 of the Responsive Image Breakpoints Generator \u2013 now featuring automatic picture element based art direction via smart cropping","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649747346\/Web_Assets\/blog\/responsive-breakpoints-hero_2142989443\/responsive-breakpoints-hero_2142989443.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649747346\/Web_Assets\/blog\/responsive-breakpoints-hero_2142989443\/responsive-breakpoints-hero_2142989443.jpg?_i=AA","width":1540,"height":1027},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/push_button_art_direction_with_cloudinary_s_responsive_image_breakpoints_generator#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Push-button Art Direction with Cloudinary\u2019s Responsive Image Breakpoints Generator"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":""}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649747346\/Web_Assets\/blog\/responsive-breakpoints-hero_2142989443\/responsive-breakpoints-hero_2142989443.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21428","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=21428"}],"version-history":[{"count":2,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21428\/revisions"}],"predecessor-version":[{"id":34263,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21428\/revisions\/34263"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/21429"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=21428"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=21428"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=21428"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}