{"id":21350,"date":"2016-01-26T09:54:05","date_gmt":"2016-01-26T09:54:05","guid":{"rendered":"http:\/\/introducing_intelligent_responsive_image_breakpoints_solutions"},"modified":"2025-08-21T12:20:14","modified_gmt":"2025-08-21T19:20:14","slug":"introducing_intelligent_responsive_image_breakpoints_solutions","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions","title":{"rendered":"Introducing Intelligent Responsive Breakpoints Solutions"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>The number of different devices available and their potential screen resolutions keep increasing, and to support this wide range of resolutions and devices, responsive website design is now the standard. A website\u2019s markup must adapt itself to look perfect on all the different devices and in various resolutions, pixel densities and mobile device orientations. Managing, transforming and delivering images, is one of the main challenges of breakpoints for responsive design that web developers face.<\/p>\n<p>Implementing a breakpoints for responsive design means building your website where the same images may be displayed in various dimensions. One image for all screen resolutions and different devices is not enough. Cloudinary is already helping developers create <a href=\"https:\/\/cloudinary.com\/features\/responsive_images\">responsive images<\/a> for websites, by uploading one image and dynamically resizing it to match different screen sizes. But clearly an image per pixel is too much &#8211; how can you automatically choose the optimal responsive image sizes?<\/p>\n<p>Whether you are using a Javascript based responsive library, the <code>srcset<\/code> image attribute, the <code>&lt;picture&gt;<\/code> HTML5 element, the modern <a href=\"http:\/\/igrigorik.github.io\/http-client-hints\/\">Client-Hints<\/a> or other responsive image solutions, they still lack a response to the common need of <strong>deciding which image resolutions to select and how many different image versions to include in your responsive website<\/strong>. These are called <strong>responsive breakpoints<\/strong> or <strong>responsive image breakpoints<\/strong>.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/responsivebreakpoints\/image\/upload\/w_200,f_auto,q_auto\/responsive_breakpoints_logo_square.png\" alt=\"Responsive Breakpoints\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"100\" height=\"100\"\/>\nCloudinary now offers a solution for intelligently finding the optimal responsive image dimensions for each specific image. The responsive breakpoints generation can be done programmatically using a cloud-based API or interactively using a new free open source web tool &#8211; the <strong><a href=\"http:\/\/www.responsivebreakpoints.com\/\">Responsive Breakpoints Generator<\/a><\/strong>.<\/p>\n<p>While Cloudinary is a commercial service (with a free plan), the Responsive Breakpoints generator is completely free, open sourced and <a href=\"https:\/\/github.com\/cloudinary\/responsive_breakpoints_generator\">hosted on GitHub<\/a>. We built it for the benefit of the community &#8211; recognizing that responsive breakpoints are a pain point for almost every developer trying to adapt their site to multiple screen sizes.<\/p>\n<h2>Image-specific breakpoints selection<\/h2>\n<p>It\u2019s a challenge to find the best breakpoints for your images, and to avoid making the mistake of not selecting enough images or selecting too many images, you\u2019ll need to understand the tradeoff between the number of different images, the visual quality and the bandwidth involved.<\/p>\n<p>When a small dimensional reduction significantly reduces the file size of the image, you should definitely create another scaled down image version. On the other hand, if scaling down images by a certain amount doesn\u2019t significantly save enough bandwidth, you can deliver bigger images to your users and let the browser handle the resizing.<\/p>\n<p>The challenge of scaling down images is further complicated by the fact that the file size reduction varies for different images. It depends not only on the specific content of the images, but also on the variable sensitivity the image has to the compression algorithms of JPEG, PNG, WebP and other image formats. For some images, a small scale down saves significant file size, while for other images even a more prominent scale down will not significantly affect the file size.<\/p>\n<p>Therefore, you will want to define the file size step where it is worth creating another scaled down image version. <strong>Jason Grigsby<\/strong> of <strong><a href=\"http:\/\/cloudfour.com\/\">Cloud Four <\/a><\/strong> called this file size step <strong>performance budget<\/strong> in his <a href=\"http:\/\/blog.cloudfour.com\/responsive-images-101-part-9-image-breakpoints\/\">article about image breakpoints<\/a>. Cloudinary\u2019s analysis verified that <strong>different images require a different number of versions<\/strong> in order to balance the bandwidth reduction trade-off according to your performance budget.<\/p>\n<p>Consider the following 2400&#215;1600 JPEG image:<\/p>\n<p><cld-code-widget\n      class=\" c-code-widget\"\n      snippets=\"[]\"\n      parsed-url=\"{&quot;url&quot;:&quot;https:\\\/\\\/res.cloudinary.com\\\/responsivebreakpoints\\\/image\\\/upload\\\/woman_glasses.jpg&quot;,&quot;cloud_name&quot;:&quot;responsivebreakpoints&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;woman_glasses.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><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/responsivebreakpoints\/image\/upload\/w_500\/woman_glasses.jpg\" alt=\"Sample photo for breakpoints calculation\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"500\" height=\"333\"\/><\/p>\n<p>Assume you need to display this image in your responsive website in various width dimensions between 200 and 1000 pixels, and you define the minimum file size step (performance budget) to be about 20KB. As the table below shows, you only need to create and deliver <strong>five different versions<\/strong> of this image to fit all the different devices and browsers.<\/p>\n<style>\n.breakpoints_table { width: 100%;  } \n.breakpoints_table td, .breakpoints_table th { font-size: 13px; padding: 7px 10px;  border: 1px solid #ddd; line-height: 18px; }\n.breakpoints_table td a { font-weight: normal; }\n.breakpoints_table th{ font-style: italic; color: #888; font-weight: normal; }\n<\/style>\n<table class=\"breakpoints_table\"><tbody><tr><th>No.\n<\/th><th>Width\n<\/th><th>Height\n<\/th><th>File size\n<\/th><th>Image\n<\/th><\/tr><tr><td>1\n<\/td><td>200\n<\/td><td>133\n<\/td><td>6.9 KB\n<\/td><td><a href=\"https:\/\/res.cloudinary.com\/responsivebreakpoints\/image\/upload\/c_scale,w_200\/v1452003467\/woman_glasses.jpg\"  target=\"_blank\">View image<\/a>\n<\/td><\/tr><tr><td>2\n<\/td><td>477\n<\/td><td>318\n<\/td><td>27.2 KB\n<\/td><td><a href=\"https:\/\/res.cloudinary.com\/responsivebreakpoints\/image\/upload\/c_scale,w_477\/v1452003467\/woman_glasses.jpg\"  target=\"_blank\">View image<\/a>\n<\/td><\/tr><tr><td>3\n<\/td><td>681\n<\/td><td>454\n<\/td><td>48.0 KB\n<\/td><td><a href=\"https:\/\/res.cloudinary.com\/responsivebreakpoints\/image\/upload\/c_scale,w_681\/v1452003467\/woman_glasses.jpg\"  target=\"_blank\">View image<\/a>\n<\/td><\/tr><tr><td>4\n<\/td><td>847\n<\/td><td>565\n<\/td><td>67.6 KB\n<\/td><td><a href=\"https:\/\/res.cloudinary.com\/responsivebreakpoints\/image\/upload\/c_scale,w_847\/v1452003467\/woman_glasses.jpg\"  target=\"_blank\">View image<\/a>\n<\/td><\/tr><tr><td>5\n<\/td><td>1000\n<\/td><td>667\n<\/td><td>86.9 KB\n<\/td><td><a href=\"https:\/\/res.cloudinary.com\/responsivebreakpoints\/image\/upload\/c_scale,w_1000\/v1452003467\/woman_glasses.jpg\"  target=\"_blank\">View image<\/a>\n<\/td><\/tr><\/tbody><\/table>\n<p>Now let\u2019s take another JPEG photo:<\/p>\n<p><cld-code-widget\n      class=\" c-code-widget\"\n      snippets=\"[]\"\n      parsed-url=\"{&quot;url&quot;:&quot;https:\\\/\\\/res.cloudinary.com\\\/responsivebreakpoints\\\/image\\\/upload\\\/castle.jpg&quot;,&quot;cloud_name&quot;:&quot;responsivebreakpoints&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;castle.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><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/responsivebreakpoints\/image\/upload\/w_500\/castle.jpg\" alt=\"Sample picture with responsive image breakpoints calculation\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"500\" height=\"333\"\/><\/p>\n<p>Trying to find the best breakpoints for this image using the same settings of 200 to 1000 pixels wide and a minimum file size step of about 20KB, results in this image needing <strong>nine different versions<\/strong> as the table below shows.<\/p>\n<table class=\"breakpoints_table\"><tbody><tr><th>No.\n<\/th><th>Width\n<\/th><th>Height\n<\/th><th>File size\n<\/th><th>Image\n<\/th><\/tr><tr><td>1\n<\/td><td>200\n<\/td><td>133\n<\/td><td>8.7 KB\n<\/td><td><a href=\"https:\/\/res.cloudinary.com\/responsivebreakpoints\/image\/upload\/c_scale,w_200\/v1451071843\/castle.jpg\"  target=\"_blank\">View image<\/a>\n<\/td><\/tr><tr><td>2\n<\/td><td>380\n<\/td><td>253\n<\/td><td>27.8 KB\n<\/td><td><a href=\"https:\/\/res.cloudinary.com\/responsivebreakpoints\/image\/upload\/c_scale,w_380\/v1451071843\/castle.jpg\"  target=\"_blank\">View image<\/a>\n<\/td><\/tr><tr><td>3\n<\/td><td>514\n<\/td><td>343\n<\/td><td>48.5 KB\n<\/td><td><a href=\"https:\/\/res.cloudinary.com\/responsivebreakpoints\/image\/upload\/c_scale,w_514\/v1451071843\/castle.jpg\"  target=\"_blank\">View image<\/a>\n<\/td><\/tr><tr><td>4\n<\/td><td>619\n<\/td><td>413\n<\/td><td>68.3 KB\n<\/td><td><a href=\"https:\/\/res.cloudinary.com\/responsivebreakpoints\/image\/upload\/c_scale,w_619\/v1451071843\/castle.jpg\"  target=\"_blank\">View image<\/a>\n<\/td><\/tr><tr><td>5\n<\/td><td>711\n<\/td><td>474\n<\/td><td>87.7 KB\n<\/td><td><a href=\"https:\/\/res.cloudinary.com\/responsivebreakpoints\/image\/upload\/c_scale,w_711\/v1451071843\/castle.jpg\"  target=\"_blank\">View image<\/a>\n<\/td><\/tr><tr><td>6\n<\/td><td>804\n<\/td><td>536\n<\/td><td>108.5 KB\n<\/td><td><a href=\"https:\/\/res.cloudinary.com\/responsivebreakpoints\/image\/upload\/c_scale,w_804\/v1451071843\/castle.jpg\"  target=\"_blank\">View image<\/a>\n<\/td><\/tr><tr><td>7\n<\/td><td>883\n<\/td><td>589\n<\/td><td>129.3 KB\n<\/td><td><a href=\"https:\/\/res.cloudinary.com\/responsivebreakpoints\/image\/upload\/c_scale,w_883\/v1451071843\/castle.jpg\"  target=\"_blank\">View image<\/a>\n<\/td><\/tr><tr><td>8\n<\/td><td>957\n<\/td><td>638\n<\/td><td>148.2 KB\n<\/td><td><a href=\"https:\/\/res.cloudinary.com\/responsivebreakpoints\/image\/upload\/c_scale,w_957\/v1451071843\/castle.jpg\"  target=\"_blank\">View image<\/a>\n<\/td><\/tr><tr><td>9\n<\/td><td>1000\n<\/td><td>667\n<\/td><td>160.7 KB\n<\/td><td><a href=\"https:\/\/res.cloudinary.com\/responsivebreakpoints\/image\/upload\/c_scale,w_1000\/v1451071843\/castle.jpg\"  target=\"_blank\">View image<\/a>\n<\/td><\/tr><\/tbody><\/table>\n<p>As shown above, the number of versions required for one image is almost half of the number required for another one. The difference might be even more dramatic for other types of photos. If you multiply this X2 difference by millions of user uploaded images, the result is a huge saving in storage, image processing costs and image management complexity, while still delivering the best looking images and preserving the user experience.<\/p>\n<h2>Responsive Breakpoints Generator &#8211; Free web tool<\/h2>\n<p>In order to perfectly balance the number of image versions for your responsive website, you need to find the correct breakpoints according to the file size step that you define. How can you do that? You can generate images for all possible width values and only select the ones that reflect a significant enough file size reduction. However this is inefficient and can be expensive.<\/p>\n<p>Analyzing the behavior of the compression mechanisms for various image formats (mainly JPEG, PNG and WebP) resulted in the creation of <strong>algorithms to efficiently and intelligently find image breakpoints<\/strong> that match the dimensions and file size saving requirements.<\/p>\n<p>Based on these algorithms we have created \u00a0a new free public web tool called the <strong><a href=\"http:\/\/www.responsivebreakpoints.com\/\">Responsive Image Breakpoints Generator<\/a><\/strong>.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/responsivebreakpoints\/image\/upload\/w_200\/responsive_breakpoints_logo_square.png\" alt=\"Introducing Responsive Breakpoints Generator\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"100\" height=\"100\"\/><\/p>\n<div style=\"float: left; padding-top: 30px\">\n<a style=\"font-size: 150%\" href=\"http:\/\/www.responsivebreakpoints.com\/\" target=\"_blank\">http:\/\/www.responsivebreakpoints.com\/<\/a>  \n<\/div>\n<div style=\"clear: both\"><\/div>  \n<p>The <a href=\"http:\/\/www.responsivebreakpoints.com\/\">Responsive Breakpoints Generator<\/a> enables you to interactively upload your images and define settings to find the matching image dimensions that fit in your graphic design requirements. As you can see in the screenshot below, you can define the required <strong>image width range<\/strong>, the <strong>file size step<\/strong> in kilobytes, and a cutoff for the <strong>maximum number of images<\/strong> you allow. In addition, you can request that the results include double resolution images for DPR 2.0 displays (e.g., Retina Display).<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/w_1000,f_auto,q_auto\/responsive_image_breakpoints_settings.png\" alt=\"Responsive image breakpoints settings\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"500\" height=\"463\"\/><\/p>\n<p>When you upload an image, the breakpoints are generated according to your settings and are calculated automatically in the cloud. The generated breakpoints are then displayed in a summary table and visually illustrated on your uploaded image. You can also download a zip file containing all the scaled down and optimized images that match the generated breakpoints.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/w_700,f_auto,q_auto\/responsive_image_breakpoints_original_aspect_ratio.jpg\" alt=\"Calculate responsive image width values of original aspect ratio\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"700\" height=\"495\"\/><\/p>\n<p>The generator tool also creates an HTML5 image tag that you can copy-paste into your code. The<a href=\"https:\/\/cloudinary.com\/blog\/responsive_images_with_srcset_sizes_and_cloudinary\"> <code>srcset<\/code> attribute of the <code>img<\/code> tag<\/a> is set to list the image versions and width values according to the intelligently selected breakpoints. Modern browsers that process the <code>img<\/code> tag will then know how to select the correct image version according to the available space of the image in your responsive web layout.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">img<\/span> <span class=\"hljs-attr\">sizes<\/span>=<span class=\"hljs-string\">\"(max-width: 1000px) 100vw, 1000px\"<\/span>\n     <span class=\"hljs-attr\">srcset<\/span>=<span class=\"hljs-string\">\"dog_c_scale,w_200.jpg 200w,\n             dog_c_scale,w_508.jpg 508w,\n             dog_c_scale,w_721.jpg 721w,\n             dog_c_scale,w_901.jpg 901w,\n             dog_c_scale,w_1000.jpg 1000w\"<\/span>\n     <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"dog_c_scale,w_1000.jpg\"<\/span>\n     <span class=\"hljs-attr\">alt<\/span>=<span class=\"hljs-string\">\"A nice dog\"<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>In addition, responsive layouts also involve <strong>art direction<\/strong>. The original images may need to be cropped to match a different aspect ratio required by the graphic design, for a mobile device for example. The breakpoints generator tool enables you to select multiple aspect ratios and breakpoints will be generated for each aspect ratio separately, while the original image is cropped to match the required aspect ratio. The downloadable zip file will also contain all the images of all the aspect ratios.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/w_500,f_auto,q_auto\/responsive_image_breakpoints_changed_aspect_ratio.jpg\" alt=\"Cropped image to match aspect ratio with auto generated breakpoints\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"500\" height=\"547\"\/><\/p>\n<p>In addition, the generator tool shows an <a href=\"http:\/\/blog.cloudfour.com\/responsive-images-101-part-6-picture-element\/\">HTML5 \u2018picture\u2019 element<\/a> code sample that combines the different aspect ratios and their breakpoints into a single responsive HTML solution. Below is a sample \u2018picture\u2019 tag which modern browsers, such as Chrome and Firefox <a href=\"http:\/\/caniuse.com\/#search=picture\">already support<\/a>, while Microsoft\u2019s Edge and Apple\u2019s Safari have just recently added support to their new official or beta versions. If you want to support older browsers as well, you can use the <a href=\"http:\/\/scottjehl.github.io\/picturefill\/\">Picturefill polyfill Javascript library<\/a>.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">picture<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">source<\/span>  <span class=\"hljs-attr\">media<\/span>=<span class=\"hljs-string\">\"(max-width: 480px)\"<\/span>\n           <span class=\"hljs-attr\">sizes<\/span>=<span class=\"hljs-string\">\"(max-width: 1000px) 100vw, 1000px\"<\/span>\n           <span class=\"hljs-attr\">srcset<\/span>=<span class=\"hljs-string\">\"dog_ar_3_4,c_fill__c_scale,w_200.jpg 200w,\n                   dog_ar_3_4,c_fill__c_scale,w_386.jpg 386w,\n                   dog_ar_3_4,c_fill__c_scale,w_522.jpg 522w,\n                   dog_ar_3_4,c_fill__c_scale,w_632.jpg 632w,\n                   dog_ar_3_4,c_fill__c_scale,w_739.jpg 739w,\n                   dog_ar_3_4,c_fill__c_scale,w_834.jpg 834w,\n                   dog_ar_3_4,c_fill__c_scale,w_920.jpg 920w,\n                   dog_ar_3_4,c_fill__c_scale,w_1000.jpg 1000w\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">source<\/span>  <span class=\"hljs-attr\">media<\/span>=<span class=\"hljs-string\">\"(max-width: 768px)\"<\/span>  \n           <span class=\"hljs-attr\">sizes<\/span>=<span class=\"hljs-string\">\"(max-width: 1000px) 100vw, 1000px\"<\/span>\n           <span class=\"hljs-attr\">srcset<\/span>=<span class=\"hljs-string\">\"dog_ar_16_9,c_fill__c_scale,w_200.jpg 200w,\n                   dog_ar_16_9,c_fill__c_scale,w_525.jpg 525w,\n                   dog_ar_16_9,c_fill__c_scale,w_746.jpg 746w,\n                   dog_ar_16_9,c_fill__c_scale,w_934.jpg 934w,\n                   dog_ar_16_9,c_fill__c_scale,w_1000.jpg 1000w\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">img<\/span> <span class=\"hljs-attr\">sizes<\/span>=<span class=\"hljs-string\">\"(max-width: 1000px) 100vw, 1000px\"<\/span>\n       <span class=\"hljs-attr\">srcset<\/span>=<span class=\"hljs-string\">\"dog_c_scale,w_200.jpg 200w,\n               dog_c_scale,w_508.jpg 508w,\n               dog_c_scale,w_721.jpg 721w,\n               dog_c_scale,w_901.jpg 901w,\n               dog_c_scale,w_1000.jpg 1000w\"<\/span>\n       <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">\"dog_c_scale,w_1000.jpg\"<\/span>\n       <span class=\"hljs-attr\">alt<\/span>=<span class=\"hljs-string\">\"A nice dog\"<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">picture<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>The <a href=\"http:\/\/www.responsivebreakpoints.com\/\">Responsive Breakpoints Generator<\/a> is <strong>a free web tool<\/strong>. It is <strong>open source under the MIT license<\/strong> and is hosted on <strong><a href=\"https:\/\/github.com\/cloudinary\/responsive_breakpoints_generator\">GitHub<\/a><\/strong>, while the actual breakpoints generation algorithms and the image resizing and cropping transformations run in the cloud.<\/p>\n<h2>Breakpoints generation automation with Cloudinary\u2019s API<\/h2>\n<p>The breakpoints generator web tool introduced above allows you to interactively process your images, which is useful if you have a reasonable amount of statically uploaded images. However, what if your web application includes user-generated content from dynamically uploaded images?<\/p>\n<p>In order to generate breakpoints for user uploaded images, you need to programmatically generate them from your code. For each uploaded image, you need to call an API method to generate the breakpoints, store or cache them on your side, and then build your HTML5 or CSS responsive web code according to these breakpoints.<\/p>\n<p><a href=\"https:\/\/cloudinary.com\/documentation\/image_upload_api_reference#upload\">Cloudinary\u2019s API<\/a> allows you to programmatically request the breakpoints for newly uploaded images or for existing ones. You can specify settings such as the width range, the file size step, and the maximum number of images, and request one or more image transformations to apply on the original image. Such transformations can include aspect-ratio based cropping, face detection based cropping and applying various image effects, filters and optimizations.<\/p>\n<p>You can call the cloud-based API from your development framework code using our open-source SDKs for Ruby on Rails, Node.js, PHP, Python, Java, .Net and other frameworks. For example, the following code generates the breakpoints and the matching images for an uploaded image:<\/p>\n<cld-code-widget\n      class=\" c-code-widget\"\n      snippets=\"[{&quot;sdkId&quot;:&quot;ruby&quot;,&quot;framework&quot;:&quot;ruby&quot;,&quot;language&quot;:&quot;ruby&quot;,&quot;displayName&quot;:&quot;Ruby&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;Cloudinary::Uploader.upload(\\&quot;dog.jpg\\&quot;,\\n            :responsive_breakpoints =&gt; \\n            {:create_derived =&gt; false, :bytes_step =&gt; 20000, \\n             :min_width =&gt; 200, :max_width =&gt; 1000,\\n             :max_images =&gt; 20},\\n             :public_id =&gt; \\&quot;dog\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;Cloudinary::Uploader.upload(\\&quot;dog.jpg\\&quot;,\\n            :responsive_breakpoints =&gt; \\n            {:create_derived =&gt; false, :bytes_step =&gt; 20000, \\n             :min_width =&gt; 200, :max_width =&gt; 1000,\\n             :max_images =&gt; 20},\\n             :public_id =&gt; \\&quot;dog\\&quot;)&quot;},{&quot;sdkId&quot;:&quot;php&quot;,&quot;framework&quot;:&quot;php&quot;,&quot;language&quot;:&quot;php&quot;,&quot;displayName&quot;:&quot;PHP&quot;,&quot;packageName&quot;:&quot;cloudinary_php&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;,&quot;packageStatus&quot;:&quot;legacy&quot;,&quot;rawCodeSnippet&quot;:&quot;\\\\Cloudinary\\\\Uploader::upload(\\&quot;dog.jpg\\&quot;, array( \\n            \\&quot;responsive_breakpoints\\&quot; =&gt; array(\\n              array(\\&quot;create_derived\\&quot; =&gt; \\&quot;false\\&quot;, \\&quot;bytes_step\\&quot; =&gt; 20000,\\n                  \\&quot;min_width\\&quot; =&gt; 200, \\&quot;max_width\\&quot; =&gt; 1000,\\n                  \\&quot;max_images\\&quot; =&gt; 20)), \\n              \\&quot;public_id\\&quot; =&gt; \\&quot;dog\\&quot;));&quot;,&quot;codeSnippet&quot;:&quot;\\\\Cloudinary\\\\Uploader::upload(\\&quot;dog.jpg\\&quot;, array( \\n            \\&quot;responsive_breakpoints\\&quot; =&gt; array(\\n              array(\\&quot;create_derived\\&quot; =&gt; \\&quot;false\\&quot;, \\&quot;bytes_step\\&quot; =&gt; 20000,\\n                  \\&quot;min_width\\&quot; =&gt; 200, \\&quot;max_width\\&quot; =&gt; 1000,\\n                  \\&quot;max_images\\&quot; =&gt; 20)), \\n              \\&quot;public_id\\&quot; =&gt; \\&quot;dog\\&quot;));&quot;},{&quot;sdkId&quot;:&quot;python&quot;,&quot;framework&quot;:&quot;python&quot;,&quot;language&quot;:&quot;python&quot;,&quot;displayName&quot;:&quot;Python&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;1.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.uploader.upload(\\&quot;dog.jpg\\&quot;, \\n            responsive_breakpoints = [\\n              {\\&quot;create_derived\\&quot;: \\&quot;false\\&quot;, \\&quot;bytes_step\\&quot;: 20000,\\n                  \\&quot;min_width\\&quot;: 200,\\n                  \\&quot;max_width\\&quot;: 1000, \\&quot;max_images\\&quot;: 20}],\\n            public_id = \\&quot;dog\\&quot;)&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.uploader.upload(\\&quot;dog.jpg\\&quot;, \\n            responsive_breakpoints = [\\n              {\\&quot;create_derived\\&quot;: \\&quot;false\\&quot;, \\&quot;bytes_step\\&quot;: 20000,\\n                  \\&quot;min_width\\&quot;: 200,\\n                  \\&quot;max_width\\&quot;: 1000, \\&quot;max_images\\&quot;: 20}],\\n            public_id = \\&quot;dog\\&quot;)&quot;},{&quot;sdkId&quot;:&quot;nodejs&quot;,&quot;framework&quot;:&quot;nodejs&quot;,&quot;language&quot;:&quot;javascript&quot;,&quot;displayName&quot;:&quot;Node.js&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.v2.uploader.upload(\\&quot;dog.jpg\\&quot;, \\n        { responsive_breakpoints: [{\\n          create_derived: false, bytes_step: 20000,\\n          min_width: 200, max_width: 1000,\\n          max_images: 20}], public_id: \\&quot;dog\\&quot;}, \\n        function(error, result) {console.log(result); });&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.v2.uploader.upload(\\&quot;dog.jpg\\&quot;, \\n        { responsive_breakpoints: [{\\n          create_derived: false, bytes_step: 20000,\\n          min_width: 200, max_width: 1000,\\n          max_images: 20}], public_id: \\&quot;dog\\&quot;}, \\n        function(error, result) {console.log(result); });&quot;},{&quot;sdkId&quot;:&quot;java&quot;,&quot;framework&quot;:&quot;java&quot;,&quot;language&quot;:&quot;java&quot;,&quot;displayName&quot;:&quot;Java&quot;,&quot;packageName&quot;:&quot;cloudinary&quot;,&quot;packageVersion&quot;:&quot;2.x&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;rawCodeSnippet&quot;:&quot;cloudinary.uploader().upload(\\&quot;dog.jpg\\&quot;, \\n        ObjectUtils.asMap(\\n        \\&quot;responsive_breakpoints\\&quot;, \\n          new ResponsiveBreakpoint().createDerived(\\&quot;false\\&quot;).bytesStep(20000).minWidth(200).maxWidth(1000).maxImages(20), \\n        \\&quot;public_id\\&quot;, \\&quot;dog\\&quot;));&quot;,&quot;codeSnippet&quot;:&quot;cloudinary.uploader().upload(\\&quot;dog.jpg\\&quot;, \\n        ObjectUtils.asMap(\\n        \\&quot;responsive_breakpoints\\&quot;, \\n          new ResponsiveBreakpoint().createDerived(\\&quot;false\\&quot;).bytesStep(20000).minWidth(200).maxWidth(1000).maxImages(20), \\n        \\&quot;public_id\\&quot;, \\&quot;dog\\&quot;));&quot;}]\"\n      parsed-url=\"[]\"\n      with-url=\"false\"\n    >\n      <span class=\"u-visually-hidden\">Loading code examples<\/span>\n    <\/cld-code-widget>\n<p>Below you can see a sample of the resulting JSON response:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">    {\n     \u00a0<span class=\"hljs-string\">\"public_id\"<\/span>: <span class=\"hljs-string\">\"dog\"<\/span>,\n     \u00a0<span class=\"hljs-string\">\"width\"<\/span>: <span class=\"hljs-number\">3000<\/span>,\n     \u00a0<span class=\"hljs-string\">\"height\"<\/span>: <span class=\"hljs-number\">2000<\/span>,\n     \u00a0<span class=\"hljs-string\">\"format\"<\/span>: <span class=\"hljs-string\">\"jpg\"<\/span>,\n     \u00a0<span class=\"hljs-string\">\"bytes\"<\/span>: <span class=\"hljs-number\">537666<\/span>,\n     \u00a0<span class=\"hljs-string\">\"url\"<\/span>: \n       <span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/v1453637947\/dog.jpg\"<\/span>,\n     \u00a0<span class=\"hljs-string\">\"secure_url\"<\/span>: \n       <span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/v1453637947\/dog.jpg\"<\/span>,\n     \u00a0...\n     \u00a0<span class=\"hljs-string\">\"responsive_breakpoints\"<\/span>: &#91;\n     \u00a0\u00a0\u00a0{\n     \u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"breakpoints\"<\/span>: &#91;\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"width\"<\/span>: <span class=\"hljs-number\">1000<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"height\"<\/span>: <span class=\"hljs-number\">667<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"bytes\"<\/span>: <span class=\"hljs-number\">79821<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_scale,w_1000\/v1453637947\/dog.jpg\"<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"secure_url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_scale,w_1000\/v1453637947\/dog.jpg\"<\/span>\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"width\"<\/span>: <span class=\"hljs-number\">891<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"height\"<\/span>: <span class=\"hljs-number\">594<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"bytes\"<\/span>: <span class=\"hljs-number\">65666<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_scale,w_891\/v1453637947\/dog.jpg\"<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"secure_url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_scale,w_891\/v1453637947\/dog.jpg\"<\/span>\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"width\"<\/span>: <span class=\"hljs-number\">712<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"height\"<\/span>: <span class=\"hljs-number\">475<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"bytes\"<\/span>: <span class=\"hljs-number\">45007<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_scale,w_712\/v1453637947\/dog.jpg\"<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"secure_url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_scale,w_712\/v1453637947\/dog.jpg\"<\/span>\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"width\"<\/span>: <span class=\"hljs-number\">503<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"height\"<\/span>: <span class=\"hljs-number\">335<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"bytes\"<\/span>: <span class=\"hljs-number\">25216<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_scale,w_503\/v1453637947\/dog.jpg\"<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"secure_url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_scale,w_503\/v1453637947\/dog.jpg\"<\/span>\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"width\"<\/span>: <span class=\"hljs-number\">200<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"height\"<\/span>: <span class=\"hljs-number\">133<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"bytes\"<\/span>: <span class=\"hljs-number\">5712<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_scale,w_200\/v1453637947\/dog.jpg\"<\/span>,\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-string\">\"secure_url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_scale,w_200\/v1453637947\/dog.jpg\"<\/span>\n     \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n     \u00a0\u00a0\u00a0\u00a0\u00a0]\n     \u00a0\u00a0\u00a0}\n     \u00a0]\n    }\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>You can tell Cloudinary to generate breakpoints for multiple transformed versions of the original image in the same API call. The Node.js code sample below used the <code>explicit<\/code> API method to generate breakpoints for an already uploaded image. Breakpoints are requested for a 16:9 face-detection based cropped version of the original image and a 4:3 sharpened image version. The <code>create_derived<\/code> flag is enabled so that the derived images don\u2019t need to be regenerated when first accessed by your users.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">cloudinary.v2.uploader.explicit(<span class=\"hljs-string\">\"dog\"<\/span>, { \n  <span class=\"hljs-attr\">responsive_breakpoints<\/span>: &#91;\n    { \n     <span class=\"hljs-attr\">create_derived<\/span>: <span class=\"hljs-literal\">true<\/span>, \n     <span class=\"hljs-attr\">bytes_step<\/span>: <span class=\"hljs-number\">20000<\/span>, \n     <span class=\"hljs-attr\">min_width<\/span>: <span class=\"hljs-number\">200<\/span>, \n     <span class=\"hljs-attr\">max_width<\/span>: <span class=\"hljs-number\">1000<\/span>,\n     <span class=\"hljs-attr\">max_images<\/span>: <span class=\"hljs-number\">20<\/span>,\n     <span class=\"hljs-attr\">transformation<\/span>: { <span class=\"hljs-attr\">crop<\/span>: <span class=\"hljs-string\">'fill'<\/span>, <span class=\"hljs-attr\">aspect_ratio<\/span>: <span class=\"hljs-string\">'16:9'<\/span>, <span class=\"hljs-attr\">gravity<\/span>: <span class=\"hljs-string\">'face'<\/span> },\n    },\n    { \n     <span class=\"hljs-attr\">create_derived<\/span>: <span class=\"hljs-literal\">true<\/span>, \n     <span class=\"hljs-attr\">bytes_step<\/span>: <span class=\"hljs-number\">30000<\/span>, \n     <span class=\"hljs-attr\">min_width<\/span>: <span class=\"hljs-number\">350<\/span>, \n     <span class=\"hljs-attr\">max_width<\/span>: <span class=\"hljs-number\">2000<\/span>,\n     <span class=\"hljs-attr\">max_images<\/span>: <span class=\"hljs-number\">18<\/span>,\n     <span class=\"hljs-attr\">transformation<\/span>: { <span class=\"hljs-attr\">crop<\/span>: <span class=\"hljs-string\">'fill'<\/span>, <span class=\"hljs-attr\">width<\/span>: <span class=\"hljs-string\">'4:3'<\/span>, <span class=\"hljs-attr\">effect<\/span>: <span class=\"hljs-string\">'sharpen'<\/span> },\n    } \n  ] }, <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>(<span class=\"hljs-params\">error, result<\/span>) <\/span>{ <span class=\"hljs-built_in\">console<\/span>.log(result); }); \n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<h2>Summary<\/h2>\n<p>Responsive design, and more specifically responsive images, are the \u2018trending topics\u2019 of the web and mobile development world. The lives of web developers aren\u2019t getting any simpler as the number of different devices and potential screen resolutions increase.<\/p>\n<p>Whichever responsive design solution or framework you choose, you still need to generate and deliver multiple versions of each image on your website. The challenge of finding the best fitting resolutions and the responsive breakpoints for each specific image, is common to all approaches and frameworks. It seems that even popular websites can still improve in the selection of the correct image dimensions.<\/p>\n<p>The solution introduced in this post allows web developers to optimize the balance between bandwidth saving and high resolution image delivery for their responsive web sites. Responsive image dimensions are intelligently selected for each specific image and you can use Cloudinary\u2019s API to automatically generate breakpoints while uploading new images or for your previously uploaded images. If you don\u2019t have a Cloudinary account yet, you can <a href=\"https:\/\/cloudinary.com\/users\/register_free\">setup one for free<\/a>.<\/p>\n<p>For the benefits of all web developers, we launched <strong><a href=\"http:\/\/www.responsivebreakpoints.com\/\">ResponsiveBreakpoints.com<\/a><\/strong>. This is a powerful free web tool. It is open sourced and <a href=\"https:\/\/github.com\/cloudinary\/responsive_breakpoints_generator\">hosted on GitHub<\/a>. Try it out \ud83d\ude42<\/p>\n<hr \/>\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":21351,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[426,145,165,251],"class_list":["post-21350","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-featured","tag-html5","tag-image-transformation","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>Generate Automatic and Image-Specific Responsive Breakpoints<\/title>\n<meta name=\"description\" content=\"Automatically find the optimal responsive image size needed for your responsive web design by using Cloudinary&#039;s open source responsive breakpoints generator\" \/>\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\/introducing_intelligent_responsive_image_breakpoints_solutions\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introducing Intelligent Responsive Breakpoints Solutions\" \/>\n<meta property=\"og:description\" content=\"Automatically find the optimal responsive image size needed for your responsive web design by using Cloudinary&#039;s open source responsive breakpoints generator\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-01-26T09:54:05+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-21T19:20:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720659\/Web_Assets\/blog\/responsive_breakpoints_post_21351a77fc\/responsive_breakpoints_post_21351a77fc.jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"700\" \/>\n\t<meta property=\"og:image:height\" content=\"359\" \/>\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\/introducing_intelligent_responsive_image_breakpoints_solutions#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Introducing Intelligent Responsive Breakpoints Solutions\",\"datePublished\":\"2016-01-26T09:54:05+00:00\",\"dateModified\":\"2025-08-21T19:20:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions\"},\"wordCount\":5,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720659\/Web_Assets\/blog\/responsive_breakpoints_post_21351a77fc\/responsive_breakpoints_post_21351a77fc.jpg?_i=AA\",\"keywords\":[\"Featured\",\"HTML5\",\"Image Transformation\",\"Responsive Images\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2016\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions\",\"url\":\"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions\",\"name\":\"Generate Automatic and Image-Specific Responsive Breakpoints\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720659\/Web_Assets\/blog\/responsive_breakpoints_post_21351a77fc\/responsive_breakpoints_post_21351a77fc.jpg?_i=AA\",\"datePublished\":\"2016-01-26T09:54:05+00:00\",\"dateModified\":\"2025-08-21T19:20:14+00:00\",\"description\":\"Automatically find the optimal responsive image size needed for your responsive web design by using Cloudinary's open source responsive breakpoints generator\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720659\/Web_Assets\/blog\/responsive_breakpoints_post_21351a77fc\/responsive_breakpoints_post_21351a77fc.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720659\/Web_Assets\/blog\/responsive_breakpoints_post_21351a77fc\/responsive_breakpoints_post_21351a77fc.jpg?_i=AA\",\"width\":700,\"height\":359},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introducing Intelligent Responsive Breakpoints Solutions\"}]},{\"@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":"Generate Automatic and Image-Specific Responsive Breakpoints","description":"Automatically find the optimal responsive image size needed for your responsive web design by using Cloudinary's open source responsive breakpoints generator","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\/introducing_intelligent_responsive_image_breakpoints_solutions","og_locale":"en_US","og_type":"article","og_title":"Introducing Intelligent Responsive Breakpoints Solutions","og_description":"Automatically find the optimal responsive image size needed for your responsive web design by using Cloudinary's open source responsive breakpoints generator","og_url":"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions","og_site_name":"Cloudinary Blog","article_published_time":"2016-01-26T09:54:05+00:00","article_modified_time":"2025-08-21T19:20:14+00:00","og_image":[{"width":700,"height":359,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720659\/Web_Assets\/blog\/responsive_breakpoints_post_21351a77fc\/responsive_breakpoints_post_21351a77fc.jpg?_i=AA","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions"},"author":{"name":"","@id":""},"headline":"Introducing Intelligent Responsive Breakpoints Solutions","datePublished":"2016-01-26T09:54:05+00:00","dateModified":"2025-08-21T19:20:14+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions"},"wordCount":5,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720659\/Web_Assets\/blog\/responsive_breakpoints_post_21351a77fc\/responsive_breakpoints_post_21351a77fc.jpg?_i=AA","keywords":["Featured","HTML5","Image Transformation","Responsive Images"],"inLanguage":"en-US","copyrightYear":"2016","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions","url":"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions","name":"Generate Automatic and Image-Specific Responsive Breakpoints","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720659\/Web_Assets\/blog\/responsive_breakpoints_post_21351a77fc\/responsive_breakpoints_post_21351a77fc.jpg?_i=AA","datePublished":"2016-01-26T09:54:05+00:00","dateModified":"2025-08-21T19:20:14+00:00","description":"Automatically find the optimal responsive image size needed for your responsive web design by using Cloudinary's open source responsive breakpoints generator","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720659\/Web_Assets\/blog\/responsive_breakpoints_post_21351a77fc\/responsive_breakpoints_post_21351a77fc.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720659\/Web_Assets\/blog\/responsive_breakpoints_post_21351a77fc\/responsive_breakpoints_post_21351a77fc.jpg?_i=AA","width":700,"height":359},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Introducing Intelligent Responsive Breakpoints Solutions"}]},{"@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\/v1649720659\/Web_Assets\/blog\/responsive_breakpoints_post_21351a77fc\/responsive_breakpoints_post_21351a77fc.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21350","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=21350"}],"version-history":[{"count":3,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21350\/revisions"}],"predecessor-version":[{"id":36866,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21350\/revisions\/36866"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/21351"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=21350"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=21350"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=21350"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}