pdfからjpgトリミング回転のまとめ

概要

2つ前の記事「画像のトリミングと回転などコマンドで一括に」(以後A)では ImageMagick の convert を中心に画像のトリミングと回転をおこないました。convert は -auto-orient で回転をすれば、Orientation を 1 にリセットしてくれて、問題が起きません。しかし、PixcelXDimension などの値は変更しないので、これを使用する環境では不具合を生じます。そこでexifの値を消去するのために、-strip オプションを使用しています。

続く「Exiftranによる画像回転とexiv2による訂正」(以後B)では、exifの値を事細かに調整する exiftran を使って回転し、exifで埋め込まれる thumbnail も作り直せることを確認しました。また、exifの値を確認したり修正したりするために exiv2 の使い方を調べました。

ここでは、はじめから exiftran を使って作業をするとどうなるかをまとめます。

さらに、OrientationやThumbnailを正しく持っている画像がどの様に取り扱われるか、exiftranとconvertとGIMPで実際に変換して比較します。

同じ操作をexiftranで

なぜこのような一連の操作が必要かはAを見てください。

処理すべきファイルがたくさんあって、同じフォルダに別名で保存する場合です。

まず pdfimages でpdfから画像を取り出し、jpg形式で保存します。

for f in *.PDF; do pdfimages -j $f ${f%.PDF} ;done

トリミングします。

for f in *.jpg;do convert $f -crop 2415x3412+0+0 cr$f;done

時計回りに270度回転します。

for f in cr*.jpg;do exiftran -o ro$f -2 $f;done

ファイル名を変更しなくても良いなら、

exiftran -2i *.jpg

サムネイル付きの画像を作るためには、

for f in ro*.jpg;do exiftran -o th$f -g $f;done

ファイル名を変更しなくても良いなら、

exiftran -gi *.jpg

結果の考察

結局実行したのは、

adachi@ebook:xjpg3$ for f in *.PDF; do pdfimages -j $f ${f%.PDF} ;done
adachi@ebook:xjpg3$ for f in *.jpg;do convert $f -crop 2415x3412+0+0 cr$f;done
adachi@ebook:xjpg3$ for f in cr*.jpg;do exiftran -o ro$f -2 $f;done
adachi@ebook:xjpg3$ for f in ro*.jpg;do exiftran -o th$f -g $f;done

出来上がったファイルを001だけ表示。cr, rocr, throcr と行った作業が左側に追加されるようにした。トリミング(crop)してもサイズが大きくなっているのはjpgの圧縮をし直しているから。

adachi@ebook:xjpg3$ ls -l *001*.jpg
-rw-rw-r-- 1 adachi adachi 5457839  7月  7 04:11 EPSON001-000.jpg
-rw-rw-r-- 1 adachi adachi 5649600  7月  7 04:12 crEPSON001-000.jpg
-rw-rw-r-- 1 adachi adachi 5957228  7月  7 04:12 rocrEPSON001-000.jpg
-rw-rw-r-- 1 adachi adachi 5963628  7月  7 04:12 throcrEPSON001-000.jpg

それぞれの作業でどうなったかを追いかけるのは

adachi@ebook:xjpg3$ exiv2 -Pkt -g Orient -g Dimension -g Thumb *001*.jpg

これで、Orient, Dimension, Thumb の含まれるものだけを抽出する

pdfから抽出したjpgファイル

もともと1ページまるごと画像をpdfにしたもの。X,Yのピクセル数から縦長の画像だということがわかる。pdfからの抽出なのでOrientationの項目はない。

EPSON001-000.jpg      Exif.Photo.PixelXDimension                    2480
EPSON001-000.jpg      Exif.Photo.PixelYDimension                    3507
トリミング後のファイル

exiftranでトリミングはできないので、convertを使う。

画像の大きさは 2415x3412 に切り詰められているが、exifの値はもとのままになっている。

crEPSON001-000.jpg    Exif.Photo.PixelXDimension                    2480
crEPSON001-000.jpg    Exif.Photo.PixelYDimension                    3507

この値を信用して画像の大きさに採用する例は殆ど無い。exifが不要な場合はconvertでも-stripで削除することができる。トリミングするような加工ではexifを残さなくてもよいかもしれない。

exiftranによる回転後

exiftranは画像を回転するだけでなく、exifを正しい画像の大きさに再設定する。2415x3412 を270度回転するので、3412x2415 になる。

exifのx-yを交換するだけでなく正しい値を入れ直している。Orientationのない画像なので何もしていないが、あれば、1-top,leftになっているはず。

rocrEPSON001-000.jpg  Exif.Photo.PixelXDimension                    3412
rocrEPSON001-000.jpg  Exif.Photo.PixelYDimension                    2415
exiftranによるサムネイルの生成後

Exif.Thumbnailの項目はいろいろ出てくるものだが、exiftranでは2つだけ。

throcrEPSON001-000.jpg  Exif.Photo.PixelXDimension                    3412
throcrEPSON001-000.jpg  Exif.Photo.PixelYDimension                    2415
throcrEPSON001-000.jpg  Exif.Thumbnail.JPEGInterchangeFormat          284
throcrEPSON001-000.jpg  Exif.Thumbnail.JPEGInterchangeFormatLength    6370

普通はexif仕様のサムネイル画像を追加しようとは考えない。今回は表示させようとしているテレビの一覧表示が遅くexifのピクセル情報を信じ込むつくりなので、ひょっとするとサムネイルがあれば、それを使って高速化できるかと思って試してみた。しかし、サムネイルを使わなかったか、使えなかったか、使ったにもかかわらずか、わからないが、だめだった。

convertとexiftranの使い分け

画像がjpgでトリミングが必要なければexiftranがよい。ロスレス変換を謳っいているので画質の低下を心配しなくてもよいし、Orientation,Dimensionも更新してくれ、サムネイルがあればそれも回転してくれます。使用者が気を使わなければならないことはほとんどありません。

トリミングが必要ならconvertでトリミングした後、exiftranでなんでもいいから他の処理をするとexifデータが必要に応じて変更されます。トリミングに合ったサムネイルが必要ならexiftranで作り直すほうがいいでしょう

Orientation以外のメタデータが外を及ぼさないならconvertでもexiftranでもよい。

画像の使用目的としてexifを消去して良いならconvert。ただし全消去しかない。exiftranでは消去ができない。(exiv2を使えば消去するターゲットをある程度絞れるし、個別に書き換えることも可能)

jpgでないデータはconvertです。exiftranはjpgのみに対応しています。

exif key 今回のTVシステム 一般的な画像処理 convert exiftran
Orientation 未調査 使用する autoならリセット すべての回転・反転でリセット
Dimension 使用する 使用しない 触らない 正しい値にセット
Thumbnail 使用する 使用しないことが多い 触らない 生成できる

デジタルカメラの写真で検証

ここまで検証に使った画像はスキャン画像でOrientationの設定はなく、Thumbnailもなかった。両方を持った写真で検証をしてみる。

用意した写真の一つがこれ。カメラが組み込んだThumbnailをexiv2で取り出したもの。一緒に写っているFと書かれた矢印の向きがカメラの上になるようにしてある。つまり、カメラの右を上に構えて撮った写真。

写真の左が下の横長の写真
写真1 (DSC_1874.JPG)

画像データは5568x3712で横長。Orientationは8:left,bottom で回転が必要になっている。

adachi@ebook:xjpg2$ exiv2 -Pkvt -g Orient -g Dimension -g Thumb DSC_1874.JPG 
Exif.Image.Orientation                        8  left, bottom
Exif.Photo.PixelXDimension                    5568  5568
Exif.Photo.PixelYDimension                    3712  3712
Exif.Thumbnail.Compression                    6  JPEG (old-style)
Exif.Thumbnail.XResolution                    300/1  300
Exif.Thumbnail.YResolution                    300/1  300
Exif.Thumbnail.ResolutionUnit                 2  inch
Exif.Thumbnail.JPEGInterchangeFormat          18956  18956
Exif.Thumbnail.JPEGInterchangeFormatLength    11564  11564
Exif.Thumbnail.YCbCrPositioning               2  Co-sited

Thumbnailはさらに調べて160x120とわかる。

adachi@ebook:xjpg2$ exiv2 -pp DSC_1874.JPG 
Preview 1: image/jpeg, 160x120 pixels, 11564 bytes

次のようにしてThumbnailを取り出したのが上の写真。

adachi@ebook:xjpg2$ exiv2 -ep DSC_1874.JPG 

縦横比が異なる分は黒として、規定通り160x120としている。本体写真と向きが揃えられている。これも規定通りでOrientationの値は両方に適用されることになっている。

検証(1) exiftranで自動

自動でOrientationに従って回転させる。

adachi@ebook:xjpg2$ exiftran -o ra_exft_1874.jpg -a DSC_1874.JPG 

お見事! Orientation, Dimention 正解。

adachi@ebook:xjpg2$ exiv2 -Pkvt -g Orient -g Dimension -g Thumb ra_exft_1874.jpg
Exif.Image.Orientation                        1  top, left
Exif.Photo.PixelXDimension                    3712  3712
Exif.Photo.PixelYDimension                    5568  5568
Exif.Thumbnail.Compression                    6  JPEG (old-style)
Exif.Thumbnail.XResolution                    300/1  300
Exif.Thumbnail.YResolution                    300/1  300
Exif.Thumbnail.ResolutionUnit                 2  inch
Exif.Thumbnail.JPEGInterchangeFormat          18880  18880
Exif.Thumbnail.JPEGInterchangeFormatLength    11531  11531
Exif.Thumbnail.YCbCrPositioning               2  Co-sited

Thumbnailの向きも合わせて回転している。これも正解。

adachi@ebook:xjpg2$ exiv2 -pp ra_exft_1874.jpg
Preview 1: image/jpeg, 120x160 pixels, 11531 bytes
正置で縦長の写真
自動で回転されたThumbnail

検証(2) exiftranで手動

角度指定で270度回転させる。出力ファイル名は微妙に変えてある。

adachi@ebook:xjpg2$ exiftran -o r2_exft_1874.jpg -2 DSC_1874.JPG 

前回同様、Orientation, Dimention 正解。

adachi@ebook:xjpg2$ exiv2 -Pkvt -g Orient -g Dimension -g Thumb r2_exft_1874.jpg 
Exif.Image.Orientation                        1  top, left
Exif.Photo.PixelXDimension                    3712  3712
Exif.Photo.PixelYDimension                    5568  5568
Exif.Thumbnail.Compression                    6  JPEG (old-style)
以下略

Thumbnailの向きも合わせて回転している。これも正解。

adachi@ebook:xjpg2$ exiv2 -pp r2_exft_1874.jpg 
Preview 1: image/jpeg, 120x160 pixels, 11531 bytes

結局自動でやったのと同じになる。人がやらずとも同じにやってくれるのが自動と考えれば、当然な設計といえる。

検証(3) convertで自動

自動でOrientationに従って回転させる。

adachi@ebook:xjpg2$ convert -auto-orient DSC_1874.JPG ra_conv_1874.jpg

Orientationは正解。Dimentionは放置されている。

adachi@ebook:xjpg2$ exiv2 -Pkvt -g Orient -g Dimension -g Thumb ra_conv_1874.jpg 
Exif.Image.Orientation                        1  top, left
Exif.Photo.PixelXDimension                    5568  5568
Exif.Photo.PixelYDimension                    3712  3712
Exif.Thumbnail.Compression                    6  JPEG (old-style)
以下略

Dimentionは放置されているが、回転はしている。

adachi@ebook:xjpg2$ exiv2 -ps ra_conv_1874.jpg 
File name       : ra_conv_1874.jpg
File size       : 8483416 Bytes
MIME type       : image/jpeg
Image size      : 3712 x 5568
以下略

Thumbnailは回転されない。

adachi@ebook:xjpg2$ exiv2 -pp ra_conv_1874.jpg 
Preview 1: image/jpeg, 160x120 pixels, 11564 bytes

検証(4) convertで手動

手動で270度回転させる。

adachi@ebook:xjpg2$ convert -rotate 270 DSC_1874.JPG r2_conv_1874.jpg

Orientationも、Dimentionも放置されている。

adachi@ebook:xjpg2$ exiv2 -Pkvt -g Orient -g Dimension -g Thumb r2_conv_1874.jpg 
Exif.Image.Orientation                        8  left, bottom
Exif.Photo.PixelXDimension                    5568  5568
Exif.Photo.PixelYDimension                    3712  3712
Exif.Thumbnail.Compression                    6  JPEG (old-style)

実際に画像は270度回転している。Orientationが元のままなので、Orientationに従って表示するソフトではかえって正しく表示されなくなる。

adachi@ebook:xjpg2$ exiv2 -ps r2_conv_1874.jpg 
File name       : r2_conv_1874.jpg
File size       : 8483416 Bytes
MIME type       : image/jpeg
Image size      : 3712 x 5568
以下略

Thumbnailは回転されない。

adachi@ebook:xjpg2$ exiv2 -pp r2_conv_1874.jpg 
Preview 1: image/jpeg, 160x120 pixels, 11564 bytes

検証(5) GIMPで自動

GIMPはOrientationが(1以外に)設定されているjpgファイルを開くときに、次のようにたずねてくる。

GIMPが回転するか尋ねてくる
GIMPのrotate or not

ここで[回転]を選択するのを、今回の自動とする。

読んだだけで自動に回転するので、そのまま名前をつけてエクスポートする。エクスポートには、exifやthumbnail を含めるか削るかの選択肢がある。すべてデフォルトのままにして、削らずに出力した。

Orientationは正しくセット。Dimentionは放置。Thumbnailは作り直しているようなので略さずに書いておく。

adachi@ebook:xjpg2$ exiv2 -Pkvt -g Orient -g Dimension -g Thumb ra_gimp_1874.jpg 
Exif.Image.Orientation                        1  top, left
Exif.Photo.PixelXDimension                    5568  5568
Exif.Photo.PixelYDimension                    3712  3712
Exif.Thumbnail.ImageWidth                     170  170
Exif.Thumbnail.ImageLength                    256  256
Exif.Thumbnail.BitsPerSample                  8 8 8  8 8 8
Exif.Thumbnail.Compression                    6  JPEG (old-style)
Exif.Thumbnail.PhotometricInterpretation      6  YCbCr
Exif.Thumbnail.SamplesPerPixel                3  3
Exif.Thumbnail.JPEGInterchangeFormat          19466  19466
Exif.Thumbnail.JPEGInterchangeFormatLength    7957  7957

もちろん回転はしている。

adachi@ebook:xjpg2$ exiv2 -ps ra_gimp_1874.jpg 
File name       : ra_gimp_1874.jpg
File size       : 4027350 Bytes
MIME type       : image/jpeg
Image size      : 3712 x 5568
以下略

Thumbnailは上にあったように170x256で、120x160ではない。

adachi@ebook:xjpg2$ exiv2 -pp ra_gimp_1874.jpg 
Preview 1: image/jpeg, 170x256 pixels, 7957 bytes

検証(6) GIMPで手動

上図に示した GIMPのrotate or not で[Keep Original]を選択し、その後画像全体を手動で回転するのを今回の手動とする。

この後、名前をつけてエクスポート。exif, thumbnail はともにデフォルトのままにして、削らずに出力した。

Orientationは元のままに残される。Dimentionは放置。Thumbnailは作り直している。

adachi@ebook:xjpg2$ exiv2 -Pkvt -g Orient -g Dimension -g Thumb r2_gimp_1874.jpg 
Exif.Image.Orientation                        8  left, bottom
Exif.Photo.PixelXDimension                    5568  5568
Exif.Photo.PixelYDimension                    3712  3712
Exif.Thumbnail.ImageWidth                     170  170
Exif.Thumbnail.ImageLength                    256  256
以下略

実際に画像は270度回転している。Orientationが元のままなので、Orientationに従って表示するソフトではかえって正しく表示されなくなる。

adachi@ebook:xjpg2$ exiv2 -ps r2_gimp_1874.jpg 
File name       : r2_gimp_1874.jpg
File size       : 7757098 Bytes
MIME type       : image/jpeg
Image size      : 3712 x 5568
以下略

Thumbnailは上にあったように170x256で、120x160ではない。

adachi@ebook:xjpg2$ exiv2 -pp r2_gimp_1874.jpg 
Preview 1: image/jpeg, 170x256 pixels, 7957 bytes

ファイルマネージャでの一覧

GNOMEのファイルマネージャ(Nautilus)の表示。書き加えた(1)〜(6)は上の検証の番号。

Nautilusはjpgファイルに埋め込まれたサムネイルは使用しない。Exif.Orientationの値に従って回転表示をする。

上で作成した全部の画像ファイルと、その中から抽出したサムネイル(名前にpreview1が入っている)が見えるようにしている。抽出したサムネイルにはOrientationの値は設定されていないので、埋め込まれたままの姿になっている。

ここで作った画像がファイルマネージャでどう見えるか
Nautilusによる表示

詳しい解説はしないので、上のファイル名と見比べて参考にしてほしい。