According to wikipedia, the interlaced progressive JPEG format compresses data in multiple passes of progressively higher detail. This is ideal for large images that will be displayed while downloading over a slow connection, allowing a reasonable preview after receiving only a portion of the data. That makes them ideal for use in websites. Programs like Irfanview can save as progressive JPG and even batch convert "plain" JPG into the progressive format. But how do we know which pictures need to be converted?
The JPEG specification is quite complex; both normal and progressive formats superficially look the same — all pictures have .JPG extension. As far as I can tell there is no system property that would tell us if a picture is progressive or not. The only way is to examine the picture header data, i.e. read the file bytes.
Disclaimer: I am not a picture format or web development expert. But it seems that the progressive format's SOF2 marker — the 2 bytes (0xFF, 0xC2) — are stored at file offset 158 in all JPG sample pictures I found. Based on this conjecture we can use xplorer² FBYTES function to fish out this information.
Right click on the column header and pick programmable from the menu, then type the following expression:
${Extension}=jpg & FBYTES(158,2)="FF.C2"
This is a boolean conjunction with two terms. Files with JPG extension and (&) with the SOF2 marker at file offset 158 satisfy the expression — its value is 1. Note we check the extension first because we don't want to slow down xplorer² checking unrelated file types. Then we can see at a glance which pictures are progressive and which aren't:
If you watch the demo video about the programmable column, you can also define a search rule on this "progressive" property we just defined, which means you can search to find all progressive JPGs in your collection (or those that are plain).
ps. As it turns out JPG pictures with EXIF information will probably store the SOF2 marker at a different position, and you'd need a program to decipher the exact location. However you may be able to get away with a few extra FBYTE terms separated with or (|) like:
${Extension}=jpg & (FBYTES(158,2)="FF.C2" | FBYTES(xxx,2)="FF.C2" | ...)
Post a comment on this topic »