jpeg画像のlossless回転

久しぶりにScanSnapしていると、どうしても部分的に歪んでしまうページが出た。上下逆にしてもダメ。横向きにすることでようやく回避できた。

実のところ、ある一ページだけで歪が出たわけではなく、ある本一冊の奇数ページすべてに歪が出ていた。紙に変なクセがついているわけでもないように見えるし、偶数ページには出てないしで、原因はよくわからない。

横向きでスキャンすると、画像を回転させなければならない。最初、Acrobatで奇数ページだけ回転というのができたなと思いやってみたのだが、そこから画像を抽出すると回転されていない横向き画像が出てきた。そりゃそうだ。

ImageMagickで処理しようとして、ふとlosslessで回転できないのかなと調べてみたところ、jpegtransというツールで可能なことが分かった。このツールは、jpegファイル中の圧縮データを直接扱っている。これに対してImageMagickのconvertでは一度デコードしてから処理をしているためlosslessではない。

だが、しかし。もう少し調べてみるとjpegtransおよび同種のツールでは問題が出るケースがあると述べられているのに気付いた。

Also note that lossless JPEG rotations have some limitations. Specifically it will roate the image but if partical blocks are present along the bottom or right edges, these will not be rotated!

Anthony Thyssen jpeg rotate lossless or not?

However these commands are NOT recommended for general use, as they are limited to the block boundaries (8 or 16 bit) of the JPEG image. That is to say That is you can only crop, rotate, or drop-in at a JPEG compression cell level, not at the actual pixel level.

Anthony Thyssen Lossless JPEG Processing

jpegでのデータ処理の際に8×8ピクセルのブロックを最小単位として扱う。block boundaryというのはこのことを指しているようだ。小さな画像を作って試してみた。

16×1620×20
元画像
convertで90度回転
jpegtransで90度回転

8×8で割り切れない20×20ピクセルの画像についてjpegtransではおかしな結果となっている。

convertがlosslessではないといっても高圧縮でなければパッと見て分かるような劣化は生じない。そういうわけで、一般的にはconvertを使っておくほうが無難だと言えるだろう。