Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Lossless crop n drop (cut and paste) for JPEGs

I'm looking for examples/blog posts/etc of lossless jpeg operations (crop n drop = cut and paste). I know there is a program jpegtran (http://jpegclub.org/jpegtran) which can perform lossless cropping (in certain situations), but there seems to be a lack of good documentation. Yes, I have tried the google.

jpegtran also has an experimental branch that allows lossless dropping (= pasting) in certain situations, but the documentation of this seems to be even worse.

What about jpegtran's drop switch is experimental? Does it have known issues? Do people use it?

drop seems like a really cool and useful feature, and I find it odd that it's been experimental for over 10 years...

And yes, one could use lossless formats such as PNG for such operations, but I'm specifically interested in JPEGs.

Thanks!

like image 295
tdp2110 Avatar asked Oct 31 '11 20:10

tdp2110


1 Answers

I spent entirely too much time trying to figure this out, so here's hoping this helps someone else. This question is pretty high on Google when searching for docs on this so-called "crop 'n drop" feature.

Overview:

jpegtran -drop allows you to "drop" the blocks from one JPEG onto another JPEG.

It only replaces existing blocks, it will not expand the input, so you cannot concatenate two JPEGs with only -drop.

However, if you supply a -crop parameter larger than the input image, JPEGTran will write out blank (grey) blocks to expand to the desired size. You can then use -drop to replace these new, blank blocks with your desired image.

Behold my crappy ASCII-art example:

  1. You have two images, A.jpg and B.jpg, both have dimensions of 256x256. We want to concatenate these side-by-side to produce a 512x256 image.

    +---------+  +---------+
    |         |  |         |
    |  A.jpg  |  |  B.jpg  |
    |         |  |         |
    +---------+  +---------+
    
  2. "Uncrop" A.jpg to the size required. The -crop parameter is standard X11 geometry notation: WIDTHxHEIGHT+X+Y Positive X/Y values measure from the top/left, and negative values from the bottom/right, respectively.

    jpegtran -crop 512x256+0+0 -outfile O.jpg A.jpg
    
    +---------+---------+
    |         \         |
    |  O.jpg  \ (blank) |
    |         \         |
    +---------+---------+
    
  3. Now "drop" B.jpg into the new, blank section in O.jpg The -drop parameter uses just the origin X/Y coordinates.

    jpegtran -drop +256+0 B.jpg -outfile O.jpg O.jpg
    
    +---------+---------+    +---------+
    |         \         |    |         |
    |  O.jpg  \    o<========|  B.jpg  |
    |         \         |    |         |
    +---------+---------+    +---------+
    
  4. Done! You now have a single file, O.jpg, with dimensions of 512x256, that contains the concatenated contents of A.jpg and B.jpg

    +-------------------+
    |                   |
    |       O.jpg       |
    |                   |
    +-------------------+
    

Notes:

  • A.jpg and B.jpg must have equal height. If B.jpg is taller, it will be cut off. If A.jpg is taller, the right side of the image will have a blank strip of padding.
  • A.jpg must have a width that ends on a complete block. (Usually means divisible by 8?)
  • B.jpg may have any width, and does not have to be a multiple of the block size.
like image 163
Unsigned Avatar answered Oct 21 '22 10:10

Unsigned