{"id":27280,"date":"2023-03-09T09:38:42","date_gmt":"2023-03-09T16:38:42","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=27280"},"modified":"2025-02-23T14:56:10","modified_gmt":"2025-02-23T22:56:10","slug":"mobile-image-optimization","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/mobile-image-optimization","title":{"rendered":"Mobile Image Optimization"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Motivation<\/h2>\n\n\n\n<p id=\"9830\">As mobile developers, we want to build successful applications, rich applications, and visual applications, this requires our application to have a lot of assets (just text won&#8217;t do it, it\u2019s not the 90s anymore).<\/p>\n\n\n\n<p id=\"d3fa\">In an ideal world, we would want to keep all assets on the application, but that doesn\u2019t make sense.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Those assets change from time to time, so we can\u2019t keep them locally on our application.<\/li>\n\n\n\n<li>If we hold many assets on our application it\u2019ll be a large file and no one will want to download it.<\/li>\n<\/ol>\n\n\n\n<p id=\"5460\">The solution to having many assets in our application but not holding them locally is to get those assets remotely, from the internet, using network calls.<br>Sounds simple, but pulling assets remotely can have many issues which I\u2019ll describe next.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Issues<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Roaming<\/strong>&nbsp;\u2014 since we\u2019re talking about mobile devices there\u2019s no guarantee that the user will have a stable connection, he could be traveling or just at a spot with a bad signal, and getting assets remotely with a bad connection can be really challenging.<\/li>\n\n\n\n<li><strong>Performance issues<\/strong>&nbsp;\u2014 Loading an asset requires resources from the device, and fitting a large asset into a small container will require some processing on the device, so think of doing that for 10 images at the same time, as we can see in the screenshot we might get blanks, holes or just long progress loading till the image finally shows.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Responsive issues<\/strong>&nbsp;\u2014 Some application support both orientations (portrait and landscape), when a container changes between orientations change what do we do with the asset? do we stretch it? fit it? crop it? it might look bad\u2026<\/li>\n\n\n\n<li><strong>Screen sizes<\/strong>&nbsp;\u2014 There are many screen sizes, It does not matter if it\u2019s iOS(the problem is less severe there) or Android, we have many screen sizes, the asset size between a small phone and a tablet is very different, do we need to create and pull an asset for each use-case? What about DPR (device pixel ratio) for each phone size? How to handle all of this? The problem only starts here cause soon we\u2019ll have expandable and foldable screens.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img width=\"1014\" height=\"500\" data-public-id=\"Moblie_Image_Optimization1\/Moblie_Image_Optimization1.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_1014,h_500,c_scale\/f_auto,q_auto\/v1677876743\/Moblie_Image_Optimization1\/Moblie_Image_Optimization1.png?_i=AA\" alt=\"\" class=\"wp-post-27280 wp-image-27284\" style=\"width:507px;height:250px\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1677876743\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1677876743\/Moblie_Image_Optimization1\/Moblie_Image_Optimization1.png?_i=AA 1014w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1677876743\/Moblie_Image_Optimization1\/Moblie_Image_Optimization1.png?_i=AA 300w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1677876743\/Moblie_Image_Optimization1\/Moblie_Image_Optimization1.png?_i=AA 768w\" sizes=\"auto, (max-width: 1014px) 100vw, 1014px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Increased data usage<\/strong>&nbsp;\u2014 If the assets are not optimized their file size is larger, this means we\u2019re pulling more bytes from the internet, which means our device\u2019s modem will work more, which means more battery usage.<br>Moreover, if the user is not connected via WIFI it might charge him extra costs.<\/li>\n\n\n\n<li><strong>Misused caching<\/strong>&nbsp;\u2014 We surely want to use some kind of cache mechanism where we keep the assets we already got locally (we do not want to pull the same asset over and over again), if the asset uses a lot in terms of bytes that means that app is getting oversized, and might get deleted since it uses too much space on the device.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img width=\"284\" height=\"626\" data-public-id=\"MoblieImageOptimzation2\/MoblieImageOptimzation2.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_284,h_626,c_scale\/f_auto,q_auto\/v1677876743\/MoblieImageOptimzation2\/MoblieImageOptimzation2.png?_i=AA\" alt=\"\" class=\"wp-post-27280 wp-image-27283\" style=\"width:142px;height:313px\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1677876743\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1677876743\/MoblieImageOptimzation2\/MoblieImageOptimzation2.png?_i=AA 284w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1677876743\/MoblieImageOptimzation2\/MoblieImageOptimzation2.png?_i=AA 136w\" sizes=\"auto, (max-width: 284px) 100vw, 284px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Memory usage<\/strong>&nbsp;\u2014 Rendering big assets requires memory, there\u2019s only so much memory that a device has, and if we try to render a lot of assets with a big size we might run into memory issues, while some devices have more memory and might handle this, others may crash due to this issue.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Dependency on Server Location \u2014&nbsp;<\/strong>Since we\u2019re pulling assets remotely we\u2019re dependent on how far we are from the server, the closer the server the faster we\u2019ll get the asset.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img width=\"1024\" height=\"487\" data-public-id=\"MoblieImageOptimization3\/MoblieImageOptimization3.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_1024,h_487,c_scale\/f_auto,q_auto\/v1677876744\/MoblieImageOptimization3\/MoblieImageOptimization3.png?_i=AA\" alt=\"\" class=\"wp-post-27280 wp-image-27282\" style=\"width:512px;height:244px\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1677876744\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1677876744\/MoblieImageOptimization3\/MoblieImageOptimization3.png?_i=AA 1400w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1677876744\/MoblieImageOptimization3\/MoblieImageOptimization3.png?_i=AA 300w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1677876744\/MoblieImageOptimization3\/MoblieImageOptimization3.png?_i=AA 768w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1677876744\/MoblieImageOptimization3\/MoblieImageOptimization3.png?_i=AA 1024w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Does it Matter?<\/h2>\n\n\n\n<p id=\"bca1\">Loading many assets without optimization can cause delays in loading page speed, it can cause performance issues, or even crashes.<br>But why all that is important? Does the loading speed of a landing page really that important?<\/p>\n\n\n\n<p id=\"7cac\">The answer to that is definitely.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>100ms<\/strong>&nbsp;delay will cause a&nbsp;<strong>7%<\/strong>&nbsp;conversion reduction (when we say conversion we mean a user puts something into his cart or turns into a paying user, or subscribed user)<br>Multiply this by 10, you get a 70% conversion reduction for a 1-second delay<br>*According to a study by Akamai.<\/li>\n\n\n\n<li><strong>A 1-second<\/strong>&nbsp;delay can cause a&nbsp;<strong>20%<\/strong>&nbsp;drop in traffic.<\/li>\n\n\n\n<li><strong>A 1-second<\/strong>&nbsp;delay decreases page views by 11%.<\/li>\n\n\n\n<li><strong>A 1-second<\/strong>&nbsp;delay can lead to a&nbsp;<strong>16%<\/strong>&nbsp;decrease in customer satisfaction.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">The Solution<\/h2>\n\n\n\n<p id=\"2b8c\">Now that we stated the problem and why is it important to optimize your media I want to show you how you can achieve this.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Improve Loading Speed&nbsp;<\/strong>\u2014 So the first thing we want to do is improve the page loading speed, we want our page to load fast and in an optimized way, this will improve the user experience for our app.<\/li>\n\n\n\n<li><strong>Reduce asset size\u00a0<\/strong>\u2014 To do that we can start with the following: reduce the size of the asset by resizing.<br>Reduce width and height (we don&#8217;t need 4k assets when presenting images feed, or thumbnails).<br>Reduce image quality, if we don&#8217;t show the image full size we can compress the image and decrease quality but still get a good-looking image,<br>We can also deliver a specific format HEIC for iOS(11+), and <a href=\"https:\/\/cloudinary.com\/tools\/compress-avif\">AVIF<\/a>(12+)\/WebP(4.2.1+) for Android (depending on the Android version).<br>All the things I just mentioned, dimensions, format, and quality will lead to lighter assets and more optimized assets that will use less space.<\/li>\n\n\n\n<li><strong>Caching<\/strong>&nbsp;\u2014 So we download an image, presented it to the user, and he decides to move to another screen, or send the app to the background and open it again, do we download the image all over again?<br>Of course not, we\u2019ll use a cache mechanism so once we download an asset, it\u2019s saved on our device and we can load it locally the next time we want to use it, of course, we want the asset to be optimized so it will use as little space as possible on the device.<\/li>\n\n\n\n<li><strong>Responsive \u2014<\/strong>&nbsp;we want to be able to get the same asset in different sizes (for different orientations for example, or different containers), we want to get that same asset in the most optimized way. Small in size for better bandwidth usage, device storage, and device performance.<\/li>\n\n\n\n<li><strong>Content delivery network \u2014<\/strong>&nbsp;or CDN for short is an extremely important mechanism, .this means that there is a grid of servers all around the world that we cache our delivered assets on once they get there for the first time.<\/li>\n\n\n\n<li>That means that if the second user asks for the same asset it\u2019ll be delivered fast since the distance between the user and that specific CDN server is shorter than the main endpoint.<\/li>\n\n\n\n<li><strong>Desktop vs Mobile Assets<\/strong>&nbsp;\u2014 Some of us might have a website that presents the same assets as our mobile application, but the desktop design is very different from the application, the size of the assets may vary depending on the platform, and we need the same image, but in different size, keeping multiple instances with different sizes for the same asset is a good solution even better if each device will get the right asset for it.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Practical<\/h2>\n\n\n\n<p id=\"21aa\">Now that we\u2019ve seen what challenges we\u2019re facing, what are the implications and how can we handle them, let\u2019s get practical, and see some code and how can we achieve better performance.<\/p>\n\n\n\n<p id=\"838f\">For this demonstration, I\u2019ll be using Cloudinary\u2019s&nbsp;<a href=\"https:\/\/github.com\/cloudinary\/cloudinary_flutter\" target=\"_blank\" rel=\"noreferrer noopener\">Flutter SDK<\/a>, feel free to use it, it\u2019ll require you to register on&nbsp;<a href=\"https:\/\/cloudinary.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Cloudinary\u2019s website.<\/a><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">Cloudinary cloudinary = Cloudinary.fromCloudName(cloudName: <span class=\"hljs-string\">'&lt;YOUR_CLOUD_NAME'<\/span>);<\/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\n\n<p id=\"be56\">The first thing I need to do is initiate my&nbsp;<code>Cloudinary<\/code>&nbsp;object with my cloud name. <\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">cloudinary.image(<span class=\"hljs-string\">'sample'<\/span>).toString()<\/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\n\n<p id=\"d2be\">The following code will generate a URL for the image&nbsp;<code>sample<\/code>&nbsp;you can find it&nbsp;<a href=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/sample\" rel=\"noreferrer noopener\" target=\"_blank\">here<\/a>.<\/p>\n\n\n\n<p id=\"6db0\">Now that we can create and pull a remote asset, let\u2019s perform optimization on it.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs shcb-wrap-lines\">Transformation transformation = Transformation()\n..delivery(Quality(Quality.auto()))\n..delivery(Format(Format.avif))\n..resize(Resize.thumbnail()..width(500))\n..delivery(Dpr(Dpr.auto));<\/code><\/span><\/pre>\n\n\n<p id=\"6db0\">I\u2019m creating the following&nbsp;<code>Transformation<\/code>&nbsp;and I\u2019m adding to it the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Quality.auto()<\/code>&nbsp;\u2014 I\u2019m asking Cloudinary to compress the image automatically for me, for a lighter asset but still with good quality.<\/li>\n\n\n\n<li><code>Fomrat.avif<\/code>&nbsp;\u2014 Since I\u2019m using Android API level 33(Android 13)<\/li>\n\n\n\n<li><code>Resize.thumbnail()..width(500)<\/code>&nbsp;\u2014 I\u2019m reducing the size of the asset, in my case I\u2019m presenting it as a thumbnail and I don&#8217;t need a full size, so I\u2019m reducing the width to 500, important to mention, I did not specify a height, I\u2019m telling Cloudinary to keep the aspect ratio of the image according to the width I gave it.<\/li>\n\n\n\n<li><code>Dpr.auto<\/code>&nbsp;\u2014 <a href=\"https:\/\/cloudinary.com\/glossary\/device-pixel-ratio\">DPR <\/a>\u2014 device pixel ratio, I\u2019m asking Cloudinary to calculate and give me the image with the DPR fit for the device automatically.<\/li>\n<\/ul>\n\n\n\n<p id=\"34ca\">Once the&nbsp;<code>Transformation<\/code>&nbsp;is ready I\u2019m injecting it into my image creation:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">cloudinary.image(<span class=\"hljs-string\">'sample'<\/span>).transformation(transformation).toString()<\/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\n\n<p id=\"d6f7\">This will create the following&nbsp;<a href=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/q_auto\/f_avif\/c_thumb,w_500\/dpr_auto\/sample\" rel=\"noreferrer noopener\" target=\"_blank\">URL<\/a>.<\/p>\n\n\n\n<p id=\"c45d\">In order to perform optimization on the image we did the following:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>We reduced the size of the asset (width and height).<\/li>\n\n\n\n<li>We set quality compression to auto.<\/li>\n\n\n\n<li>We set DPR to auto.<\/li>\n\n\n\n<li>We set the right format for this use case,&nbsp;<code>AVIF<\/code>.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img width=\"540\" height=\"960\" data-public-id=\"MoblieImageOptimization4\/MoblieImageOptimization4.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_540,h_960,c_scale\/f_auto,q_auto\/v1677876744\/MoblieImageOptimization4\/MoblieImageOptimization4.png?_i=AA\" alt=\"\" class=\"wp-post-27280 wp-image-27281\" style=\"width:270px;height:480px\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1677876744\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1677876744\/MoblieImageOptimization4\/MoblieImageOptimization4.png?_i=AA 540w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1677876744\/MoblieImageOptimization4\/MoblieImageOptimization4.png?_i=AA 169w\" sizes=\"auto, (max-width: 540px) 100vw, 540px\" \/><\/figure>\n\n\n\n<p id=\"cf36\">The following screenshot shows an example from a demo application I built.<\/p>\n\n\n\n<p id=\"8f89\">In the left column, you can see the original image with its size underneath.<br>In the right column, we have the transformed image (the image with the transformation from above).<\/p>\n\n\n\n<p id=\"8ef2\">We can see that we managed to cut the size of each image by up to 10 times.<br>This optimization will make it easier for the device to pull the assets remotely, render and decode them into their container and will give us better application performance overall.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p id=\"5305\">We just talked about why we even develop mobile applications. What is the challenge? Why does it matter? And what is the solution? I gave you practical tools, on how to optimize your media and with that your application\u2019s performance.<br>The important thing to remember is media optimization done right can improve your application\u2019s conversion rate, traffic, and customer satisfaction.<\/p>\n\n\n\n<p id=\"2cf4\">Important to add, in this article we showed an example using the Cloudinary&nbsp;<a href=\"https:\/\/github.com\/cloudinary\/cloudinary_flutter\" rel=\"noreferrer noopener\" target=\"_blank\">Flutter SDK<\/a>, this SDK is written in more than 15 other languages\/frameworks such as:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/cloudinary\/cloudinary_android\" rel=\"noreferrer noopener\" target=\"_blank\">Android SDK<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/cloudinary\/cloudinary_ios\" rel=\"noreferrer noopener\" target=\"_blank\">iOS SDK<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/cloudinary\/cloudinary_kotlin\" rel=\"noreferrer noopener\" target=\"_blank\">Kotlin SDK<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Motivation As mobile developers, we want to build successful applications, rich applications, and visual applications, this requires our application to have a lot of assets (just text won&#8217;t do it, it\u2019s not the 90s anymore). In an ideal world, we would want to keep all assets on the application, but that doesn\u2019t make sense. The [&hellip;]<\/p>\n","protected":false},"author":54,"featured_media":27296,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[227],"class_list":["post-27280","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-performance-optimization"],"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>Mobile Image Optimization<\/title>\n<meta name=\"description\" content=\"Learn how Cloudinary can improve mobile loading speed, fix responsive issues, deliver by multi-CDN, and improve mobile image optimization.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mobile Image Optimization\" \/>\n<meta property=\"og:description\" content=\"Learn how Cloudinary can improve mobile loading speed, fix responsive issues, deliver by multi-CDN, and improve mobile image optimization.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2023-03-09T16:38:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-02-23T22:56:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1678236845\/Mobile-image-optimization\/Mobile-image-optimization-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:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/mobile-image-optimization\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Mobile Image Optimization\",\"datePublished\":\"2023-03-09T16:38:42+00:00\",\"dateModified\":\"2025-02-23T22:56:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/mobile-image-optimization\"},\"wordCount\":1667,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1678236845\/Mobile-image-optimization\/Mobile-image-optimization.jpg?_i=AA\",\"keywords\":[\"Performance Optimization\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2023\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/mobile-image-optimization\",\"url\":\"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc\",\"name\":\"Mobile Image Optimization\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc#primaryimage\"},\"image\":{\"@id\":\"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1678236845\/Mobile-image-optimization\/Mobile-image-optimization.jpg?_i=AA\",\"datePublished\":\"2023-03-09T16:38:42+00:00\",\"dateModified\":\"2025-02-23T22:56:10+00:00\",\"description\":\"Learn how Cloudinary can improve mobile loading speed, fix responsive issues, deliver by multi-CDN, and improve mobile image optimization.\",\"breadcrumb\":{\"@id\":\"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1678236845\/Mobile-image-optimization\/Mobile-image-optimization.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1678236845\/Mobile-image-optimization\/Mobile-image-optimization.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mobile Image Optimization\"}]},{\"@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":"Mobile Image Optimization","description":"Learn how Cloudinary can improve mobile loading speed, fix responsive issues, deliver by multi-CDN, and improve mobile image optimization.","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:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc","og_locale":"en_US","og_type":"article","og_title":"Mobile Image Optimization","og_description":"Learn how Cloudinary can improve mobile loading speed, fix responsive issues, deliver by multi-CDN, and improve mobile image optimization.","og_url":"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc","og_site_name":"Cloudinary Blog","article_published_time":"2023-03-09T16:38:42+00:00","article_modified_time":"2025-02-23T22:56:10+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1678236845\/Mobile-image-optimization\/Mobile-image-optimization-jpg?_i=AA","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/mobile-image-optimization"},"author":{"name":"","@id":""},"headline":"Mobile Image Optimization","datePublished":"2023-03-09T16:38:42+00:00","dateModified":"2025-02-23T22:56:10+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/mobile-image-optimization"},"wordCount":1667,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1678236845\/Mobile-image-optimization\/Mobile-image-optimization.jpg?_i=AA","keywords":["Performance Optimization"],"inLanguage":"en-US","copyrightYear":"2023","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/mobile-image-optimization","url":"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc","name":"Mobile Image Optimization","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc#primaryimage"},"image":{"@id":"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1678236845\/Mobile-image-optimization\/Mobile-image-optimization.jpg?_i=AA","datePublished":"2023-03-09T16:38:42+00:00","dateModified":"2025-02-23T22:56:10+00:00","description":"Learn how Cloudinary can improve mobile loading speed, fix responsive issues, deliver by multi-CDN, and improve mobile image optimization.","breadcrumb":{"@id":"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1678236845\/Mobile-image-optimization\/Mobile-image-optimization.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1678236845\/Mobile-image-optimization\/Mobile-image-optimization.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/medium.com\/codex\/mobile-what-image-format-should-i-use-39b44e9f86fc#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Mobile Image Optimization"}]},{"@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\/v1678236845\/Mobile-image-optimization\/Mobile-image-optimization.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/27280","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\/54"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=27280"}],"version-history":[{"count":16,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/27280\/revisions"}],"predecessor-version":[{"id":36984,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/27280\/revisions\/36984"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/27296"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=27280"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=27280"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=27280"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}