{"id":21692,"date":"2018-03-07T17:46:36","date_gmt":"2018-03-07T17:46:36","guid":{"rendered":"http:\/\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery"},"modified":"2024-06-04T15:33:42","modified_gmt":"2024-06-04T22:33:42","slug":"giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery","title":{"rendered":"Giving your mobile app a boost &#8211; Part 2:  Mobile responsive image delivery"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>In <a href=\"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_1_pre_upload_image_processing\">part 1 of this blog series,<\/a> we told you how we can optimize the process of uploading user images from your mobile app by taking advantage of the new pre-upload image processing functionality available in Cloudinary\u2019s iOS and Android SDKs.  We showed how you can scale down all user images to the maximum size necessary before you upload them, to save bandwidth and improve app performance.<\/p>\n<p>In this part, I\u2019ll show you how to implement our new <a href=\"https:\/\/cloudinary.com\/features\/responsive_images\">responsive images<\/a> solution, which enables you to optimize the image you deliver based on the requesting device\u2019s resolution and the available dimensions. This new feature can help you to simplify the many complexities of creating multiple variants of every media assets, with on-the-fly manipulation and fast delivery through the CDN.<\/p>\n<h2>What is mobile responsive image delivery?<\/h2>\n<p>Having a responsive mobile app design means  that the content responds to the application environment. In the scope of media assets, this means that images should be automatically adjusted for optimal viewing based on device size and layout. As mobile developers, we should make the effort to optimize our application for different screen sizes and densities, and it\u2019s our responsibility to be careful about our assumptions regarding pixels and bandwidth, because not all users have high-end devices or a strong internet connection.<\/p>\n<h3>Supporting multiple device sizes and slow connections<\/h3>\n<p>The Android ecosystem has <a href=\"https:\/\/qz.com\/472767\/there-are-now-more-than-24000-different-android-devices\/\">tens of thousands of different devices<\/a> that offer different hardware capabilities, screen sizes and densities. iOS has a much smaller set of possibilities, but it still has quite a few to add to the mix.<\/p>\n<p>You might also be surprised to hear that <a href=\"https:\/\/www.youtube.com\/watch?v=7V-fIGMDsmE#t=81m30s\">25% of new Android devices selling today have only 512MB RAM<\/a>. These devices are mostly found in emerging markets like India, but definitely not only there.<\/p>\n<p>Moreover, according to <a href=\"http:\/\/opensignal.com\/reports\/2016\/11\/state-of-lte\">OpenSignal<\/a>, when talking about mobile internet connections, even in countries like Germany, Italy, France and the U.K, the chances that a 4G subscriber will connect to an LTE network are little better than a coin flip. This means that even when our phones and mobile suppliers support it, we don\u2019t always enjoy the benefits of a high speed network.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/q_auto,dpr_auto\/mobile_lte_quality.png\" alt=\"Likelihood of an LTE connection per country\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1400\" height=\"705\"\/><\/p>\n<p style= \"font-size: small;text-align: center;margin-top: -8px; \"><i>Image source:  igvita.com: <a href=\"https:\/\/www.igvita.com\/2015\/01\/26\/resilient-networking\/\">Resilient Networking <\/a><\/i><\/p>\n<p>Making your images deliver more responsively improves the user experience and minimizes the user\u2019s data plan usage.  You deliver the image that looks and fits best in each user\u2019s device without sending an image that would be too large or too heavy for those seeing it on a small screen or via a low bandwidth connection.<\/p>\n<h3>Different devices and different display dimensions<\/h3>\n<p>Delivering responsive images also requires us to be aware of the size, quality and format of the original images and adapt all of these depending of the target view and the platform of the final user.<\/p>\n<h3>The problem is vividly clear<\/h3>\n<p>The following screenshots highlight the challenges described above. The screenshot on the left shows a mobile app that downloads original images. They look great, but its a huge download expense \u2013 over 10 megabytes for a few thumbnails that barely fill the screen. The screenshot on the right shows the same app set to download all the thumbnails at a fixed width of 100px. The images have a very small download size of around 40 kilobytes each and the images even look reasonable on smaller devices, but look quite bad on large screens or high density devices.<\/p>\n<div style=\"clear: both; margin-bottom: 20px\">\n<\/div>\n<div style=\"text-align:center;\">\n<span style=\"display:inline-block;vertical-align:top;\">\n<a href=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/dpr_auto,q_auto\/mobile_app_with_high_quality_images.jpg\" target =\"_blank\"><img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/q_auto,dpr_auto\/w_255\/mobile_app_with_high_quality_images.jpg\" alt=\"mobile app with high quality, large filesize images\" title=\"mobile app with high quality, large filesize images\" style=\"margin-right: 10px;display:block;\" \/><\/a>\n<b style=\"margin-right: 10px;display:block;\">high quality, huge filesize<\/b>\n<\/span>\n<span style=\"display:inline-block;vertical-align:top;\">\n<a href=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/dpr_auto,q_auto\/mobile_app_with_low_quality_images.jpg\" target =\"_blank\"><img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/q_auto,dpr_auto\/w_255\/mobile_app_with_low_quality_images.jpg\" alt=\"mobile app with small filesize, but low quality images\" title=\"mobile app with small filesize, but low quality images\" style=\"margin-right: 10px;display:block;\" \/><\/a>\n<b style=\"margin-right: 10px;display:block;\">small filesize, but poor quality<\/b>\n<\/span>\n<\/div>\n<div style=\"clear: both; margin-bottom: 20px\">\n<\/div>\n<p>What this app needs is an easy way to deliver different image sizes to different devices, never exceeding the max resolution that looks good on each device for the defined image view size.<\/p>\n<h2>Cloudinary as your one-stop-shop for mobile media management<\/h2>\n<p>Cloudinary can help reduce the complexity of maintaining and generating multiple image versions with its dynamic image manipulation features. You can build Cloudinary dynamic image URLs that define any image width and height you want. This means you don\u2019t have to pre-create perhaps hundreds of versions of each image. Instead your images are dynamically resized on-the-fly, before delivery, as needed. Using Cloudinary, you can upload a single, high-resolution image to the cloud and deliver it in as many different sizes as your users (whom you don\u2019t know) need via URL parameters according to the target devices.<\/p>\n<p>To make things even easier, you can now use our mobile responsive solution, which not only saves expensive development time, but also automatically handles the calculation of the required image dimensions for the many (many, many) device screen sizes.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/q_auto,dpr_auto\/android_fragmentation.png\" alt=\"Android device fragmentation\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"2094\" height=\"1402\"\/><\/p>\n<p style= \"font-size: small;text-align: center;margin-top: -12px;\"><i>Image source: OpenSignal 2015: Android device fragmentation<\/i><\/p>\n<p>When you include the responsive option in your delivery command, Cloudinary first retrieves the exact available dimensions for the image view element that is requesting the image, and then rounds up the height and width to the nearest step (100 by default). For example, if the exact image view width is 284X284 pixels, a 300X300 pixel width image is generated on-the-fly and delivered to the requesting device. This functionality prevents too many image versions being generated and reduces cache hits for subsequent requests from other devices. The next time any image view measuring 201-300 pixels requests the same image, the existing 300X300 image is delivered directly from the CDN cache.<\/p>\n<p>Not only does this solution save you the effort of pre-generating tens or hundreds of images; it also eliminates the guesswork on the required sizes and number of images needed.  Such guesswork nearly inevitably leads to some delivered images being too small for the image view, resulting in poor quality, while others may be significantly too large, resulting in wasted bandwidth.<\/p>\n<h3>Let\u2019s see it in action<\/h3>\n<h4>Android<\/h4>\n<p>You use the MediaManager\u2019s <code>responsiveUrl<\/code> and <code>generate<\/code> methods to generate a dynamic image URL based on the dimensions needed for the image according to a specified ImageView element.<\/p>\n<p>For example, to generate the responsiveUrl for the sample image, automatically resized to fill the available width and height:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">MediaManager.get().responsiveUrl(<span class=\"hljs-literal\">true<\/span>, <span class=\"hljs-literal\">true<\/span>, <span class=\"hljs-string\">\"fill\"<\/span>, <span class=\"hljs-string\">\"auto\"<\/span>).generate(<span class=\"hljs-string\">\"sample\"<\/span>, profileImageView, <span class=\"hljs-keyword\">new<\/span> ResponsiveUrl.Callback() { @Override public <span class=\"hljs-keyword\">void<\/span> onUrlReady(Url url) \n{ \n<span class=\"hljs-comment\">\/* Use your favorite image download library to fetch the image, picasso example:\n*\/<\/span>\n Picasso.with(context).load(url.generate()).into(imageView); } });\nCode language: JavaScript (javascript)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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<h4>iOS<\/h4>\n<p>With iOS, it\u2019s a little different since the responsive method is provided at the level of the UIImageView component. For example, here\u2019s how you would set an iOS UIImageView component named <code>photoImageView<\/code> to responsively fetch and display the <code>sample<\/code> image in JPEG format, automatically resized to fill the available width and height:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-keyword\">let<\/span> transformation = CLDTransformation().setFetchFormat(<span class=\"hljs-string\">\"jpg\"<\/span>)\n<span class=\"hljs-keyword\">let<\/span> params = CLDResponsiveParams(autoWidth: <span class=\"hljs-literal\">true<\/span>, <span class=\"hljs-attr\">autoHeight<\/span>: <span class=\"hljs-literal\">true<\/span>, \n  <span class=\"hljs-attr\">cropMode<\/span>:   <span class=\"hljs-string\">\"fill\"<\/span>, <span class=\"hljs-attr\">gravity<\/span>: <span class=\"hljs-string\">\"auto\"<\/span>)\n\nphotoImageView.cldSetImage(publicId: <span class=\"hljs-string\">\"sample\"<\/span>, <span class=\"hljs-attr\">cloudinary<\/span>: cld, \n  <span class=\"hljs-attr\">resourceType<\/span>: <span class=\"hljs-string\">\"image\"<\/span>, <span class=\"hljs-attr\">responsiveParams<\/span>: params, <span class=\"hljs-attr\">transformation<\/span>: transformation)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><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>For more information on the usage of these methods, take a look at our responsive documentation for <a href=\"https:\/\/cloudinary.com\/documentation\/android_image_manipulation#responsive_images\">Android<\/a> and  <a href=\"https:\/\/cloudinary.com\/documentation\/ios_image_manipulation#responsive_images\">iOS<\/a><\/p>\n<p>Remember the problematic file sizes and qualities in those <a href=\"#the_problem_is_vividly_clear\">screenshots we showed earlier<\/a>?\nWell, with the simple code like that shown above, you get the optimal image size for each device.  With this code, the same app we described above now scales the images according to screen size and density. For small, low density screens, the images are delivered at about 30-40 Kb. For large, higher density screens, the images will be delivered at up to 200-250 Kb (still a far cry from the original 10MB images and the visual quality is just as good).<\/p>\n<h3>Let\u2019s sum It up<\/h3>\n<p>This post demonstrated how Cloudinary optimizes the trade-off between required image size and number of images by automating the calculation based on the requesting device in real-time. This enables you to deliver <strong>responsive images<\/strong> to your native iOS or Android app by adding a single line of code.<\/p>\n<p>In our <a href=\"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_1_pre_upload_image_processing\">previous post<\/a>, we showed how you can use our other new feature, <strong>pre-upload processing<\/strong>, to perform client-size resizing of user-generated content based on the maximum size you ever expect to deliver that image, and to only upload the resized image.<\/p>\n<p>Using both of these new mobile SDK features in your Android and iOS apps can save your users bandwidth and improve app performance on both upload and delivery, while saving you valuable development time and effort.<\/p>\n<p>If you don\u2019t have a Cloudinary account yet, <a href=\"https:\/\/cloudinary.com\/users\/register_free\">sign up for a free one<\/a>, install the <a href=\"https:\/\/cloudinary.com\/documentation\/ios_integration#installation\">iOS<\/a> and\/or <a href=\"https:\/\/cloudinary.com\/documentation\/android_integration#installation\">Android<\/a> SDKs, and discover how quickly you can start improving your users\u2019 experience.  Oh, and if you have a web-based version of your application, make sure you check out how to <a href=\"https:\/\/cloudinary.com\/documentation\/responsive_images\">deliver images responsively in the browser<\/a>.<\/p>\n<p>We can\u2019t wait to hear how you are going to use these new capabilities and we\u2019d love to hear how they improve the performance of your native mobile app.<\/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":21693,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[333,174,227,251,263],"class_list":["post-21692","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-android","tag-ios","tag-performance-optimization","tag-responsive-images","tag-sdk"],"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>Give your mobile app a boost: Responsive image delivery<\/title>\n<meta name=\"description\" content=\"Learn how to automate responsive image delivery in your native mobile app, maximizing performance and user experience, with only a couple lines of code.\" \/>\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\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Giving your mobile app a boost - Part 2: Mobile responsive image delivery\" \/>\n<meta property=\"og:description\" content=\"Learn how to automate responsive image delivery in your native mobile app, maximizing performance and user experience, with only a couple lines of code.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-03-07T17:46:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-04T22:33:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649718542\/Web_Assets\/blog\/mobile_responsive_images\/mobile_responsive_images-jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"2000\" \/>\n\t<meta property=\"og:image:height\" content=\"1100\" \/>\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\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Giving your mobile app a boost &#8211; Part 2: Mobile responsive image delivery\",\"datePublished\":\"2018-03-07T17:46:36+00:00\",\"dateModified\":\"2024-06-04T22:33:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery\"},\"wordCount\":12,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718542\/Web_Assets\/blog\/mobile_responsive_images\/mobile_responsive_images.jpg?_i=AA\",\"keywords\":[\"Android\",\"iOS\",\"Performance Optimization\",\"Responsive Images\",\"SDK\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2018\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery\",\"url\":\"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery\",\"name\":\"Give your mobile app a boost: Responsive image delivery\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718542\/Web_Assets\/blog\/mobile_responsive_images\/mobile_responsive_images.jpg?_i=AA\",\"datePublished\":\"2018-03-07T17:46:36+00:00\",\"dateModified\":\"2024-06-04T22:33:42+00:00\",\"description\":\"Learn how to automate responsive image delivery in your native mobile app, maximizing performance and user experience, with only a couple lines of code.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718542\/Web_Assets\/blog\/mobile_responsive_images\/mobile_responsive_images.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718542\/Web_Assets\/blog\/mobile_responsive_images\/mobile_responsive_images.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Giving your mobile app a boost &#8211; Part 2: Mobile responsive image delivery\"}]},{\"@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":"Give your mobile app a boost: Responsive image delivery","description":"Learn how to automate responsive image delivery in your native mobile app, maximizing performance and user experience, with only a couple lines of code.","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\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery","og_locale":"en_US","og_type":"article","og_title":"Giving your mobile app a boost - Part 2: Mobile responsive image delivery","og_description":"Learn how to automate responsive image delivery in your native mobile app, maximizing performance and user experience, with only a couple lines of code.","og_url":"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery","og_site_name":"Cloudinary Blog","article_published_time":"2018-03-07T17:46:36+00:00","article_modified_time":"2024-06-04T22:33:42+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649718542\/Web_Assets\/blog\/mobile_responsive_images\/mobile_responsive_images-jpg?_i=AA","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery"},"author":{"name":"","@id":""},"headline":"Giving your mobile app a boost &#8211; Part 2: Mobile responsive image delivery","datePublished":"2018-03-07T17:46:36+00:00","dateModified":"2024-06-04T22:33:42+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery"},"wordCount":12,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718542\/Web_Assets\/blog\/mobile_responsive_images\/mobile_responsive_images.jpg?_i=AA","keywords":["Android","iOS","Performance Optimization","Responsive Images","SDK"],"inLanguage":"en-US","copyrightYear":"2018","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery","url":"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery","name":"Give your mobile app a boost: Responsive image delivery","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718542\/Web_Assets\/blog\/mobile_responsive_images\/mobile_responsive_images.jpg?_i=AA","datePublished":"2018-03-07T17:46:36+00:00","dateModified":"2024-06-04T22:33:42+00:00","description":"Learn how to automate responsive image delivery in your native mobile app, maximizing performance and user experience, with only a couple lines of code.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718542\/Web_Assets\/blog\/mobile_responsive_images\/mobile_responsive_images.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718542\/Web_Assets\/blog\/mobile_responsive_images\/mobile_responsive_images.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/giving_your_mobile_app_a_boost_part_2_mobile_responsive_image_delivery#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Giving your mobile app a boost &#8211; Part 2: Mobile responsive image delivery"}]},{"@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\/v1649718542\/Web_Assets\/blog\/mobile_responsive_images\/mobile_responsive_images.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21692","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=21692"}],"version-history":[{"count":7,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21692\/revisions"}],"predecessor-version":[{"id":34344,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21692\/revisions\/34344"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/21693"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=21692"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=21692"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=21692"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}