{"id":21432,"date":"2020-05-24T10:35:00","date_gmt":"2020-05-24T17:35:00","guid":{"rendered":"http:\/\/progressive_jpegs_and_green_martians"},"modified":"2025-08-21T12:17:45","modified_gmt":"2025-08-21T19:17:45","slug":"progressive_jpegs_and_green_martians","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians","title":{"rendered":"Progressive JPEGs and green Martians"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>JPEG images are either <a href=\"https:\/\/cloudinary.com\/blog\/image_formats_getting_it_right\">progressive or nonprogressive<\/a>, depending on their encoding order, not politics.<\/p>\n<p>Encoding of and decoding of nonprogressive occurs in this simple order: from top to bottom and from left to right. Consequently, when a nonprogressive JPEG is loading on a slow connection, you see the image\u2019s top part first, followed by the other parts as loading progresses.<\/p>\n<p>On the other hand, because progressive JPEGs are <a href=\"https:\/\/cloudinary.com\/glossary\/run-length-encoding\">encoded<\/a> differently, when they load, you see a blurry version, which gradually becomes sharper as the bytes arrive.<\/p>\n<p>\nThe encoding process of a progressive JPEG is what makes it unique. When saving an image as a progressive JPEG, this can be done easily through image editing software by selecting the option &#8220;Save as progressive JPEG&#8221; in the save dialog. This choice influences how the image is processed and displayed during loading.\n<\/p>\n<p>Here is the same JPEG, the left version nonprogressive and the right one progressive, <a href=\"https:\/\/res.cloudinary.com\/jon\/video\/upload\/non_progressive_vs_progressive_JPEG.mp4\" target=\"_blank\">decoded in slow motion<\/a>:<\/p>\n<p><video\n      controls\n      muted\n      preload=\"none\"\n      class=\"c-transformed-asset c-transformed-asset--video\"\n      poster=\"https:\/\/res.cloudinary.com\/cloudinary\/video\/upload\/non_progressive_vs_progressive_jpeg.jpg\"\n       width=\"100%\" height=\"100%\"\n    >\n      <source src=\"https:\/\/res.cloudinary.com\/cloudinary\/video\/upload\/vc_h265\/non_progressive_vs_progressive_jpeg.mp4\" type=\"video\/mp4; codecs=hevc\">\n<source src=\"https:\/\/res.cloudinary.com\/cloudinary\/video\/upload\/vc_vp9\/non_progressive_vs_progressive_jpeg.webm\" type=\"video\/webm; codecs=vp9\">\n<source src=\"https:\/\/res.cloudinary.com\/cloudinary\/video\/upload\/vc_auto\/non_progressive_vs_progressive_jpeg.mp4\" type=\"video\/mp4\">\n<source src=\"https:\/\/res.cloudinary.com\/cloudinary\/video\/upload\/vc_auto\/non_progressive_vs_progressive_jpeg.webm\" type=\"video\/webm\">\n    <\/video><\/p>\n<p>In essence, progressive and nonprogressive encodings for JPEGs are two ways in which to optimize images and make them display faster on sluggish connections.<\/p>\n<h2>What\u2019s the Magic Behind Progressive JPEGs?<\/h2>\n<p>JPEG performs two transformations for lossy compression:<\/p>\n<ol>\n<li>Convert RGB pixels to <a href=\"https:\/\/en.wikipedia.org\/wiki\/YCbCr\">YCbCr<\/a> pixels. Instead of Red, Green, and Blue channels, JPEG works with a luma (Y) channel and two chroma channels (Cb and Cr). Because the human eye is more sensitive to distortion in luma (brightness) than to that in chroma (color), JPEG handles channels separately and, optionally, downsample the chroma channels to half the original resolution\u2014a process called <a href=\"https:\/\/cloudinary.com\/glossary\/chroma-subsampling\">chroma subsampling<\/a>.<\/li>\n<li>Do mathematical magic, called <a href=\"https:\/\/en.wikipedia.org\/wiki\/Discrete_cosine_transform\">Discrete Cosine Transform<\/a> (DCT), with the pixels. That is, convert every block of 8&#215;8 pixels (64-pixel values) to 64 coefficients, which convey the block\u2019s information in a different way. The first coefficient, called the DC coefficient, is the average pixel value of all the pixels in the block. The other 63 coefficients, called AC coefficients, depict the horizontal and vertical details within the block in the order of low frequency (overall gradients) to high frequency (sharp details).<\/li>\n<\/ol>\n<p>\nTo further understand how a progressive JPEG image loads, it&#8217;s crucial to note the concept of &#8220;Scans&#8221; in JPEG encoding. During the encoding process, the number of scans determines how many times the image is refined during loading. Each scan adds more detail to the image, starting from a basic, blurry version and progressively enhancing the quality until the full picture is clear.\n<\/p>\n<p>For human perception, luma and low-frequency signals are more important than chroma and high-frequency signals. Cleverly, JPEG encodes with less precision what we can\u2019t see well anyway, resulting in smaller files. The article <a href=\"https:\/\/parametric.press\/issue-01\/unraveling-the-jpeg\/\"><em>Unraveling the JPEG<\/em><\/a> is a brilliant interactive demonstration of how those transformations work. And, as a bonus, they also enable progressive encoding and decoding of JPEGs.<\/p>\n<p>Instead of going through an image block by block, you can encode each block\u2019s coefficients through <strong>spectral selection<\/strong>, as nonprogressive JPEGs do, i.e., encode all the DC coefficients first, then some low-frequency AC coefficients and the high-frequency AC coefficients. Alternatively, you can apply <strong>successive approximation<\/strong>, i.e., store the most significant bits of the coefficients first and the least significant ones later in the bitstream.<\/p>\n<p>Both spectral selection and successive approximation require that the encoder and decoder traverse the image multiple times. Each iteration is called a <strong>scan<\/strong>. Typically, encoding a progressive JPEG takes about 10 scans, which is why, during decoding, an image transitions from being blurry to being sharp after about 10 refinement steps.<\/p>\n<h2>What Are the Advantages and Disadvantages of Progressive JPEGs?<\/h2>\n<p>One obvious advantage of progressive JPEGs is that they display a full preview while downloading an image on a slow connection. You can see the picture even when only a fraction of the file has been transferred and decide whether to wait for the download to complete. However, some people consider that loading behavior a disadvantage because it\u2019s hard to tell <strong>when<\/strong> an image has finished loading. You might form a bad impression of the website because \u201cthe photos look blurry\u201d when, in fact, the site is still loading and displaying  a progressive preview of the images. More on that point later.<\/p>\n<p>\nThe ability to convert a progressive JPEG to a baseline JPEG adds flexibility in image handling. By opening a progressive JPEG in any image editing program and saving it as a standard JPEG, one can easily switch between these two formats based on the needs of the application or website. This flexibility is particularly useful for designers and web developers.\n<\/p>\n<p>A less obvious advantage of progressive JPEGs is that they tend to be smaller in size than nonprogressive JPEGs even though the final image looks exactly the same. Because similar DCT coefficients across multiple blocks in progressive JPEGs are encoded together, smaller files result; whereas nonprogressive JPEGs, whose blocks are encoded one by one, weigh more. Oftentimes, the extra compression is only a few percentage points, yet it still saves bandwidth and storage without affecting the image quality.<\/p>\n<p>As for the downsides of progressive JPEGs, first of all, they\u2019re not <strong>always<\/strong> smaller. For small images like thumbnails, progressive JPEGs are often a bit larger than nonprogressive JPEGs. For such small image files, progressive rendering delivers no gains.<\/p>\n<p>Additionally, it takes more CPU time to encode and decode progressive JPEGs because the algorithm must go over the image data multiple times, not in one single scan. Plus, the process incurs more memory since all the DCT coefficients must be stored in memory during decoding. In nonprogressive decoding, you need to store only one block of coefficients at a time.<\/p>\n<p>Decoding progressive JPEGs takes about 2.5 times longer than decoding nonprogressive ones. So, despite the fast delivery of a preview, the overall CPU time is significantly longer\u2014whether on a desktop or laptop computer. Actually, progressive or not, JPEG decoding is pretty fast, and memory and processing power are usually abundant. On low-power devices like smartphones, however, decoding does have a slight impact on battery life and load time.<\/p>\n<p>Encoding progressive JPEGs also takes longer by about six to eight times, and it\u2019s harder to do that in hardware. That\u2019s why cameras, even high-end ones, produce nonprogressive JPEGs as a rule.<\/p>\n<h2>How to Get the Best of Both Worlds?<\/h2>\n<p>Encoding JPEGs is <strong>not<\/strong> a binary choice between progressive and nonprogressive. You can do something in between.<\/p>\n<p>By default, most progressive JPEG encoders define the segment of the image data in each of the 10 scans with a scan script. Advanced encoders like <a href=\"https:\/\/github.com\/mozilla\/mozjpeg\">MozJPEG<\/a> try out different scripts and pick the one that results in the best compression, which might require fewer or more scans, depending on the image.<\/p>\n<p>You can combine the advantages of progressive and nonprogressive encoding by customizing the scan script. After some experimentation and adoption of a few ideas from <a href=\"https:\/\/speakerdeck.com\/tbaldauf\/your-hero-images-need-you-save-the-day-with-http2-image-loading?slide=31\">an inspiring talk by Tobias Baldauf<\/a>, Cloudinary came up with the following scan script for encoding progressive JPEGs:<\/p>\n<pre class=\"js-syntax-highlighted\"><code>0 1 2: 0 0 0 0;\n0: 1 9 0 0;\n2: 1 63 0 0 ;\n1: 1 63 0 0 ;\n0: 10 63 0 0;\n<\/code><\/pre>\n<p>The script runs five scans, with each line corresponding to a scan:<\/p>\n<ul>\n<li>The first scan encodes the DC coefficients of all three channels (0=Y, 1=Cb, and 2=Cr).<\/li>\n<li>The second scan encodes the first nine AC coefficients of the luma channel.<\/li>\n<li>The third and fourth scans encode all the AC coefficients of the chroma channels: Cr  first because it tends to be more important visually.<\/li>\n<li>The final, fifth scan contains the remaining 54 AC coefficients of the luma channel.<\/li>\n<\/ul>\n<p>The scan script leverages spectral selection, not successive approximation, which has a larger negative impact on the decode speed because the same coefficient is revisited multiple times. Also, since the decode time lengthens in proportion to the number of scans, the script runs only five scans.<\/p>\n<p>That\u2019s a good trade-off, a medium-ground or semiprogressive option for nonprogressive and default progressive encoding. A few more details:<\/p>\n<ul>\n<li>\n<strong>Decode time:<\/strong> almost as fast as nonprogressive encoding. On my laptop, a nonprogressive JPEG decodes at about 215 megapixels per second; a default progressive JPEG, about 110 MP\/s; and a semiprogressive JPEG, about 185 MP\/s.<\/li>\n<li>\n<strong>Compression:<\/strong> usually between the result produced by nonprogressive encoding and the default progressive <a href=\"https:\/\/cloudinary.com\/glossary\/encoding\">encoding<\/a>. A few tests on several corpuses of images revealed that a default progressive JPEG was on average 4.5% smaller than a nonprogressive one; a semiprogressive JPEG was 3.2% smaller. In reality, the result depends on the image: semiprogressive JPEGs are sometimes even smaller than default progressive ones, but closer to the size of nonprogressive JPEGs.<\/li>\n<li>\n<strong>Progressive rendering:<\/strong> almost the same as default progressive encoding. The only difference is that progressing rendering takes fewer refinement steps, which is not necessarily a negative outcome, as explained later in this post.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/res.cloudinary.com\/cloudinary\/video\/upload\/non-p_vs_p_vs_semi-p.webm\" target=\"_blank\">Here is a comparison<\/a> of an image encoded with MozJPEG as a nonprogressive JPEG (on the left), a default progressive JPEG (in the center), and a semiprogressive JPEG (on the right):<\/p>\n<p><video\n      controls\n      muted\n      preload=\"none\"\n      class=\"c-transformed-asset c-transformed-asset--video\"\n      poster=\"https:\/\/res.cloudinary.com\/cloudinary\/video\/upload\/non-p_vs_p_vs_semi-p.jpg\"\n       width=\"100%\" height=\"100%\"\n    >\n      <source src=\"https:\/\/res.cloudinary.com\/cloudinary\/video\/upload\/vc_h265\/non-p_vs_p_vs_semi-p.mp4\" type=\"video\/mp4; codecs=hevc\">\n<source src=\"https:\/\/res.cloudinary.com\/cloudinary\/video\/upload\/vc_vp9\/non-p_vs_p_vs_semi-p.webm\" type=\"video\/webm; codecs=vp9\">\n<source src=\"https:\/\/res.cloudinary.com\/cloudinary\/video\/upload\/vc_auto\/non-p_vs_p_vs_semi-p.mp4\" type=\"video\/mp4\">\n<source src=\"https:\/\/res.cloudinary.com\/cloudinary\/video\/upload\/vc_auto\/non-p_vs_p_vs_semi-p.webm\" type=\"video\/webm\">\n    <\/video><\/p>\n<p>In this example, the nonprogressive JPEG is 283 KB; the default progressive JPEG, 271 KB; and the semiprogressive, 280 KB. Note that since the default progressive JPEG takes more refinement steps to process, it delivers a high-quality preview faster than the semiprogressive JPEG.<\/p>\n<p>However, the gain in compression comes at a price:<\/p>\n<ul>\n<li>First, the default progressive JPEG takes longer to decode. On my laptop, the nonprogressive JPEG decodes in 8.2 ms., the semiprogressive JPEG, 11.9 ms; and the default progressive JPEG, 18.4 ms. Obviously, that\u2019s not the main reason for slow page loads, but it does affect the speed.<\/li>\n<li>Second, the default way of progressive encoding takes longer. That\u2019s usually not an issue unless you\u2019re generating images on demand to avoid latency.<\/li>\n<li>A potentially bigger problem is that the first few progressive scans result in a weird-looking default progressive JPEG\u2014at least with the image below, which was encoded with MozJPEG.<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary\/image\/upload\/w_700,c_fill,f_auto,q_auto,dpr_2.0\/first_prog_scans.png\" alt=\"First Progressive Scan\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1400\" height=\"788\"\/><\/p>\n<p>Yikes! Why do we get a green Martian first, which then turns out to be a human?<\/p>\n<p>That\u2019s because, in this case, MozJPEG decides that splitting the DC coefficients of the three channels into three separate scans yields more compression. The Martian is what you get if only one of the two chroma channels is available.<\/p>\n<p>From a psycho-visual point of view, it\u2019s probably just as unsettling to have images with a flash of strange colors as it is to have them with a <a href=\"http:\/\/www.paulirish.com\/2009\/fighting-the-font-face-fout\/\">flash of unstyled text<\/a>. So, in this respect, the simpler semiprogressive scan script might be a better choice.<\/p>\n<h2>How About Another Scan Script?<\/h2>\n<p>With the default progressive and semiprogressive scan scripts, it can be hard to tell exactly when the image has completely loaded. Whether or not this is a problem is debatable: after all, the progressive mechanism is doing its job of producing a high-quality preview fast.<\/p>\n<p>At Cloudinary, we believe in giving users options, so let\u2019s see about heading off this caveat.<\/p>\n<p>Toward that end, some websites progressively render images in two steps: load small, low-quality placeholder images first and then replace them with the actual versions. Given the large gap between a placeholder image and an actual one, you can readily tell when loading is complete.<\/p>\n<p>But wait. How about progressively rendering images in two steps with just one file through an appropriate scan script?<\/p>\n<p>Unfortunately, given the limitations of the JPEG standard, a <a href=\"https:\/\/cloudinary.com\/glossary\/progressive-scan\">progressive scan<\/a> script cannot consist of only two scans, at least not for color images. However, a scan, such as the one  below, that delivers a quick low-quality preview, followed by a steep transition to the full-quality image, is viable. Let\u2019s call it \u201csteep-progressive.\u201d<\/p>\n<pre class=\"js-syntax-highlighted\"><code>0 1 2: 0 0 0 2;\n0 1 2: 0 0 2 1;\n0 1 2: 0 0 1 0;\n1: 1 63 0 0 ;\n2: 1 63 0 0 ;\n0: 1 63 0 0;\n<\/code><\/pre>\n<p>The scans work like this:<\/p>\n<ul>\n<li>The first scan encodes the DC coefficients of all three channels, except for the two least significant bits, churning out a rough preview in short order.<\/li>\n<li>The next two scans encode those two missing bits, delivering only minimal visual improvement.<\/li>\n<li>The next two scans encode the remaining chroma data, again lending only a minor quality boost because the blocky luma still remains.<\/li>\n<li>The final scan, which usually handles the bulk of the data, encodes the rest of the luma specifics. When it starts loading, this scan replaces the rough preview with the final image, from top to bottom, much like a nonprogressive image.<\/li>\n<\/ul>\n<p>For comparison, the video below shows the various scan scripts in action as they scan the same exact image, but in a different order. <a href=\"https:\/\/res.cloudinary.com\/cloudinary\/video\/upload\/progressive_jpeg_scanscripts.mp4\" target=\"_blank\">From left to right in the video<\/a>: nonprogressive, steep-progressive, semiprogressive, and default progressive.<\/p>\n<p><video\n      controls\n      muted\n      preload=\"none\"\n      class=\"c-transformed-asset c-transformed-asset--video\"\n      poster=\"https:\/\/res.cloudinary.com\/cloudinary\/video\/upload\/progressive_jpeg_scanscripts.jpg\"\n       width=\"100%\" height=\"100%\"\n    >\n      <source src=\"https:\/\/res.cloudinary.com\/cloudinary\/video\/upload\/vc_h265\/progressive_jpeg_scanscripts.mp4\" type=\"video\/mp4; codecs=hevc\">\n<source src=\"https:\/\/res.cloudinary.com\/cloudinary\/video\/upload\/vc_vp9\/progressive_jpeg_scanscripts.webm\" type=\"video\/webm; codecs=vp9\">\n<source src=\"https:\/\/res.cloudinary.com\/cloudinary\/video\/upload\/vc_auto\/progressive_jpeg_scanscripts.mp4\" type=\"video\/mp4\">\n<source src=\"https:\/\/res.cloudinary.com\/cloudinary\/video\/upload\/vc_auto\/progressive_jpeg_scanscripts.webm\" type=\"video\/webm\">\n    <\/video><\/p>\n<h2>Want to Give It a Try?<\/h2>\n<p>So, how to make semiprogressive or steep-progressive JPEGs, you ask? Most image programs do not offer that option. However, you can copy and paste either of those two scan scripts into a text file on the command line and then run the following command with the <a href=\"http:\/\/libjpeg-turbo.org\">libjpeg<\/a> or <a href=\"https:\/\/github.com\/mozilla\/mozjpeg\">MozJPEG<\/a> encoder:<\/p>\n<p><code>cjpeg -scans scanscript.txt &lt; input.ppm &gt; output.jpg<\/code><\/p>\n<p>If you\u2019re a Cloudinary user, you\u2019re likely already serving semiprogressive JPEGs without realizing it. By setting the <a href=\"https:\/\/cloudinary.com\/blog\/the_holy_grail_of_image_optimization_or_balancing_visual_quality_and_file_size\"><code>q_auto<\/code><\/a> parameter, you automatically reap semiprogressive JPEGs unless the image is very small, in which case you should opt for nonprogressives.<\/p>\n<p><code>q_auto<\/code> also performs these useful tasks:<\/p>\n<ul>\n<li>Determine whether to enable chroma subsampling.<\/li>\n<li>Figure out which <a href=\"https:\/\/cloudinary.com\/blog\/image_formats_getting_it_right\">image format<\/a> to adopt if combined with <code>f_auto<\/code>.<\/li>\n<li>Adjust the quality parameters to balance between avoiding artifacts and reducing the file size.<\/li>\n<\/ul>\n<p>Absent the <code>q_auto<\/code> parameter, Cloudinary encodes nonprogressive JPEGs by default. Here are your options:<\/p>\n<ul>\n<li>To get a (default) progressive JPEG, set the flag <code>fl_progressive<\/code>.<\/li>\n<li>To leverage the semiprogressive scan script, set the flag <code>fl_progressive:semi<\/code>.<\/li>\n<li>To leverage the steep-progressive scan script, set the flag <code>fl_progressive:steep<\/code>.<\/li>\n<li>To force <code>q_auto<\/code> to produce nonprogressive JPEGs, set the flag <code>fl_progressive:none<\/code>.<\/li>\n<\/ul>\n<p>The overview below summarizes the pros and cons of the progressive scan scripts described in this post.<\/p>\n<div style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;\" dir=\"ltr\">&nbsp;<\/div>\n<div style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;\" dir=\"ltr\">&nbsp;<\/div>\n<div style=\"margin-left: 0pt;\" dir=\"ltr\">\n<table style=\"border: none; border-collapse: collapse; width: 100%;\">\n<tbody>\n<tr style=\"height: 0px;\">\n<td style=\"border-left: solid #000000 0px; border-right: solid #5f6568 1px; border-bottom: solid #5f6568 1px; border-top: solid #000000 0px; vertical-align: middle; padding: 4px 4px 4px 4px;\">\n<div style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;\" dir=\"ltr\">&nbsp;<\/div>\n<\/td>\n<td style=\"border-left: solid #5f6568 1px; border-right: solid #5f6568 1px; border-bottom: solid #5f6568 1px; border-top: solid #000000 0px; vertical-align: middle; padding: 4px 4px 4px 4px;\">\n<p style=\"line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 13.3333px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">Non-progressive<\/span><\/p>\n<\/td>\n<td style=\"border-left: solid #5f6568 1px; border-right: solid #5f6568 1px; border-bottom: solid #5f6568 1px; border-top: solid #000000 0px; vertical-align: middle; padding: 4px 4px 4px 4px;\">\n<p style=\"line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 13.3333px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">Steep-progressive<\/span><\/p>\n<\/td>\n<td style=\"border-left: solid #5f6568 1px; border-right: solid #5f6568 1px; border-bottom: solid #5f6568 1px; border-top: solid #000000 0px; vertical-align: middle; padding: 4px 4px 4px 4px;\">\n<p style=\"line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 13.3333px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">Semi-progressive<\/span><\/p>\n<\/td>\n<td style=\"border-left: solid #5f6568 1px; border-right: solid #5f6568 1px; border-bottom: solid #5f6568 1px; border-top: solid #000000 0px; vertical-align: middle; padding: 4px 4px 4px 4px;\">\n<p style=\"line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 13.3333px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">Default progressive<\/span><\/p>\n<\/td>\n<\/tr>\n<tr style=\"height: 44px;\">\n<td style=\"border-left: solid #000000 0px; border-right: solid #5f6568 1px; border-bottom: solid #5f6568 1px; border-top: solid #5f6568 1px; vertical-align: middle; padding: 4px 4px 4px 4px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">Cloudinary flag:<\/span><\/p>\n<\/td>\n<td style=\"vertical-align: middle; padding: 4px 4px 4px 4px; border: solid #5f6568 1px;\">\n<p style=\"line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 9.33333px; font-family: 'Courier New'; background-color: transparent; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;\">fl_progressive:none<\/span><\/p>\n<p style=\"line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 13.3333px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">(default)<\/span><\/p>\n<\/td>\n<td style=\"vertical-align: middle; padding: 4px 4px 4px 4px; border: solid #5f6568 1px;\">\n<p style=\"line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 9.33333px; font-family: 'Courier New'; background-color: transparent; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;\">fl_progressive:steep<\/span><\/p>\n<\/td>\n<td style=\"vertical-align: middle; padding: 4px 4px 4px 4px; border: solid #5f6568 1px;\">\n<p style=\"line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 9.33333px; font-family: 'Courier New'; background-color: transparent; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;\">fl_progressive:semi<\/span><\/p>\n<p style=\"line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 12px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">(<\/span><span style=\"font-size: 12px; font-family: 'Courier New'; background-color: transparent; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;\">q_auto<\/span><span style=\"font-size: 12px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\"> default)<\/span><\/p>\n<\/td>\n<td style=\"vertical-align: middle; padding: 4px 4px 4px 4px; border: solid #5f6568 1px;\">\n<p style=\"line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 9.33333px; font-family: 'Courier New'; background-color: transparent; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;\">fl_progressive<\/span><\/p>\n<\/td>\n<\/tr>\n<tr style=\"height: 0px;\">\n<td style=\"border-left: solid #000000 0px; border-right: solid #5f6568 1px; border-bottom: solid #5f6568 1px; border-top: solid #5f6568 1px; vertical-align: middle; padding: 4px 4px 4px 4px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">Progressive rendering<\/span><\/p>\n<\/td>\n<td style=\"vertical-align: middle; padding: 4px 4px 4px 4px; border: solid #5f6568 1px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">\u274c<\/span><\/p>\n<\/td>\n<td style=\"vertical-align: middle; padding: 4px 4px 4px 4px; border: solid #5f6568 1px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">\u2605<\/span><\/p>\n<\/td>\n<td style=\"vertical-align: middle; padding: 4px 4px 4px 4px; border: solid #5f6568 1px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">\u2605\u2605<\/span><\/p>\n<\/td>\n<td style=\"vertical-align: middle; padding: 4px 4px 4px 4px; border: solid #5f6568 1px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">\u2605\u2605\u2605<\/span><\/p>\n<\/td>\n<\/tr>\n<tr style=\"height: 0px;\">\n<td style=\"border-left: solid #000000 0px; border-right: solid #5f6568 1px; border-bottom: solid #5f6568 1px; border-top: solid #5f6568 1px; vertical-align: middle; padding: 4px 4px 4px 4px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">Easy to tell when done loading<\/span><\/p>\n<\/td>\n<td style=\"vertical-align: middle; padding: 4px 4px 4px 4px; border: solid #5f6568 1px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">\u2605\u2605\u2605<\/span><\/p>\n<\/td>\n<td style=\"vertical-align: middle; padding: 4px 4px 4px 4px; border: solid #5f6568 1px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">\u2605\u2605<\/span><\/p>\n<\/td>\n<td style=\"vertical-align: middle; padding: 4px 4px 4px 4px; border: solid #5f6568 1px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">\u2605<\/span><\/p>\n<\/td>\n<td style=\"vertical-align: middle; padding: 4px 4px 4px 4px; border: solid #5f6568 1px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">\u274c<\/span><\/p>\n<\/td>\n<\/tr>\n<tr style=\"height: 0px;\">\n<td style=\"border-left: solid #000000 0px; border-right: solid #5f6568 1px; border-bottom: solid #5f6568 1px; border-top: solid #5f6568 1px; vertical-align: middle; padding: 4px 4px 4px 4px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">Smaller files<\/span><\/p>\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">(on average)<\/span><\/p>\n<\/td>\n<td style=\"vertical-align: middle; padding: 4px 4px 4px 4px; border: solid #5f6568 1px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">\u274c<\/span><\/p>\n<\/td>\n<td style=\"vertical-align: middle; padding: 4px 4px 4px 4px; border: solid #5f6568 1px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">\u274c<\/span><\/p>\n<\/td>\n<td style=\"vertical-align: middle; padding: 4px 4px 4px 4px; border: solid #5f6568 1px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">\u2605\u2605<\/span><\/p>\n<\/td>\n<td style=\"vertical-align: middle; padding: 4px 4px 4px 4px; border: solid #5f6568 1px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">\u2605\u2605\u2605<\/span><\/p>\n<\/td>\n<\/tr>\n<tr style=\"height: 0px;\">\n<td style=\"border-left: solid #000000 0px; border-right: solid #5f6568 1px; border-bottom: solid #000000 0px; border-top: solid #5f6568 1px; vertical-align: middle; padding: 4px 4px 4px 4px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">Decode speed<\/span><\/p>\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">(and encode speed)<\/span><\/p>\n<\/td>\n<td style=\"border-left: solid #5f6568 1px; border-right: solid #5f6568 1px; border-bottom: solid #000000 0px; border-top: solid #5f6568 1px; vertical-align: middle; padding: 4px 4px 4px 4px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">\u2605\u2605\u2605<\/span><\/p>\n<\/td>\n<td style=\"border-left: solid #5f6568 1px; border-right: solid #5f6568 1px; border-bottom: solid #000000 0px; border-top: solid #5f6568 1px; vertical-align: middle; padding: 4px 4px 4px 4px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">\u2605<\/span><\/p>\n<\/td>\n<td style=\"border-left: solid #5f6568 1px; border-right: solid #5f6568 1px; border-bottom: solid #000000 0px; border-top: solid #5f6568 1px; vertical-align: middle; padding: 4px 4px 4px 4px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">\u2605\u2605<\/span><\/p>\n<\/td>\n<td style=\"border-left: solid #5f6568 1px; border-right: solid #5f6568 1px; border-bottom: solid #000000 0px; border-top: solid #5f6568 1px; vertical-align: middle; padding: 4px 4px 4px 4px;\">\n<p style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt; text-align: center;\" dir=\"ltr\"><span style=\"font-size: 14.6667px; font-family: Arial; background-color: transparent; vertical-align: baseline; white-space: pre-wrap;\">\u274c<\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;\" dir=\"ltr\">&nbsp;<\/div>\n<div style=\"line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;\" dir=\"ltr\">&nbsp;<\/div>\n<h2>What\u2019s Cloudinary\u2019s Game Plan for Image Encoding?<\/h2>\n<p>The technicalities of image formats can be tricky to master, let alone that there remains much to be discovered even in \u201cold\u201d formats like JPEG. Even though you can decode images in only one way, you can encode them in many ways, one of which is to modify the JPEG encoding and fine-tune the image-loading behavior with custom progressive scan scripts .<\/p>\n<p>Certain new image formats, such as <a href=\"https:\/\/cloudinary.com\/blog\/how_jpeg_xl_compares_to_other_image_codecs\">JPEG XL<\/a>, also support progressive decoding . In general, because progessive decoding makes little sense in video, that approach does not work with the formats that are derived from video codecs (WebP, HEIC, AVIF).<\/p>\n<p>We at Cloudinary are fully aware that, as the web evolves to be more and more visual and most of the downloaded content on a page is images and videos, image optimization is key to user experience. In an ongoing effort to get the most out of every <a href=\"https:\/\/cloudinary.com\/blog\/image_formats_getting_it_right\">image format<\/a>, we continuously enhance our image encoding and processing algorithms for the best possible end-user experience.<\/p>\n<p>Concurrently, we strive to make life as easy as possible for developers. Do add <code>q_auto,f_auto<\/code> to your image URLs to automatically take advantage of the benefits from best practices and new image formats, now and in the future.<\/p>\n<hr \/>\n<h2>Want to Learn More About Image Formats?<\/h2>\n<ul>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/image_formats_getting_it_right\"><em>Image Formats: Getting it Right<\/em><\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/how_jpeg_xl_compares_to_other_image_codecs\"><em>How JPEG XL Compares to Other Image Codecs<\/em><\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/animated_webp_how_to_convert_animated_gif_to_webp_and_save_up_to_90_bandwidth\"><em>Animated WebP: How to Convert Animated GIF to WebP and Save Up To 90% Bandwidth<\/em><\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/optimize_your_jpeg_images_without_compromising_quality_with_jpegmini_and_cloudinary\"><em>JPEG Image Optimization Without Compromising Quality With JPEGmini and Cloudinary<\/em><\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/how_to_support_webp_images_save_bandwidth_and_improve_user_performance\"><em>Check for WebP Browser Support to Dynamically Deliver Images<\/em><\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/quick_guide_using_webp_on_your_website_or_native_apps\"><em>Adopting the WebP Image Format for Android on Websites Or Native Apps<\/em><\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/lossy_compression_for_optimizing_animated_gifs\"><em>Optimizing Animated GIFs With Lossy Compression<\/em><\/a>\n<\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":21433,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[426,157,165,179],"class_list":["post-21432","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-featured","tag-image-formats","tag-image-transformation","tag-jpeg"],"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>Three Ways for Encoding Progressive JPEGs<\/title>\n<meta name=\"description\" content=\"Learn three ways in which to encode and then deliver progressive JPEG images in an efficient and user-friendly manner.\" \/>\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\/progressive_jpegs_and_green_martians\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Progressive JPEGs and green Martians\" \/>\n<meta property=\"og:description\" content=\"Learn three ways in which to encode and then deliver progressive JPEG images in an efficient and user-friendly manner.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-24T17:35:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-21T19:17:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720798\/Web_Assets\/blog\/03_progressive_jpegs\/03_progressive_jpegs.jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1540\" \/>\n\t<meta property=\"og:image:height\" content=\"847\" \/>\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\/progressive_jpegs_and_green_martians#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Progressive JPEGs and green Martians\",\"datePublished\":\"2020-05-24T17:35:00+00:00\",\"dateModified\":\"2025-08-21T19:17:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians\"},\"wordCount\":5,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720798\/Web_Assets\/blog\/03_progressive_jpegs\/03_progressive_jpegs.jpg?_i=AA\",\"keywords\":[\"Featured\",\"Image Formats\",\"Image Transformation\",\"JPEG\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2020\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians\",\"url\":\"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians\",\"name\":\"Three Ways for Encoding Progressive JPEGs\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720798\/Web_Assets\/blog\/03_progressive_jpegs\/03_progressive_jpegs.jpg?_i=AA\",\"datePublished\":\"2020-05-24T17:35:00+00:00\",\"dateModified\":\"2025-08-21T19:17:45+00:00\",\"description\":\"Learn three ways in which to encode and then deliver progressive JPEG images in an efficient and user-friendly manner.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720798\/Web_Assets\/blog\/03_progressive_jpegs\/03_progressive_jpegs.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720798\/Web_Assets\/blog\/03_progressive_jpegs\/03_progressive_jpegs.jpg?_i=AA\",\"width\":1540,\"height\":847},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Progressive JPEGs and green Martians\"}]},{\"@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":"Three Ways for Encoding Progressive JPEGs","description":"Learn three ways in which to encode and then deliver progressive JPEG images in an efficient and user-friendly manner.","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\/progressive_jpegs_and_green_martians","og_locale":"en_US","og_type":"article","og_title":"Progressive JPEGs and green Martians","og_description":"Learn three ways in which to encode and then deliver progressive JPEG images in an efficient and user-friendly manner.","og_url":"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians","og_site_name":"Cloudinary Blog","article_published_time":"2020-05-24T17:35:00+00:00","article_modified_time":"2025-08-21T19:17:45+00:00","og_image":[{"width":1540,"height":847,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720798\/Web_Assets\/blog\/03_progressive_jpegs\/03_progressive_jpegs.jpg?_i=AA","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians"},"author":{"name":"","@id":""},"headline":"Progressive JPEGs and green Martians","datePublished":"2020-05-24T17:35:00+00:00","dateModified":"2025-08-21T19:17:45+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians"},"wordCount":5,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720798\/Web_Assets\/blog\/03_progressive_jpegs\/03_progressive_jpegs.jpg?_i=AA","keywords":["Featured","Image Formats","Image Transformation","JPEG"],"inLanguage":"en-US","copyrightYear":"2020","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians","url":"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians","name":"Three Ways for Encoding Progressive JPEGs","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720798\/Web_Assets\/blog\/03_progressive_jpegs\/03_progressive_jpegs.jpg?_i=AA","datePublished":"2020-05-24T17:35:00+00:00","dateModified":"2025-08-21T19:17:45+00:00","description":"Learn three ways in which to encode and then deliver progressive JPEG images in an efficient and user-friendly manner.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720798\/Web_Assets\/blog\/03_progressive_jpegs\/03_progressive_jpegs.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649720798\/Web_Assets\/blog\/03_progressive_jpegs\/03_progressive_jpegs.jpg?_i=AA","width":1540,"height":847},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/progressive_jpegs_and_green_martians#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Progressive JPEGs and green Martians"}]},{"@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\/v1649720798\/Web_Assets\/blog\/03_progressive_jpegs\/03_progressive_jpegs.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21432","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=21432"}],"version-history":[{"count":14,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21432\/revisions"}],"predecessor-version":[{"id":36819,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21432\/revisions\/36819"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/21433"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=21432"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=21432"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=21432"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}