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で実際に変換して比較します。
なぜこのような一連の操作が必要かは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 の含まれるものだけを抽出する
もともと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は画像を回転するだけでなく、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
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のピクセル情報を信じ込むつくりなので、ひょっとするとサムネイルがあれば、それを使って高速化できるかと思って試してみた。しかし、サムネイルを使わなかったか、使えなかったか、使ったにもかかわらずか、わからないが、だめだった。
画像が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と書かれた矢印の向きがカメラの上になるようにしてある。つまり、カメラの右を上に構えて撮った写真。
画像データは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の値は両方に適用されることになっている。
自動で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
角度指定で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
結局自動でやったのと同じになる。人がやらずとも同じにやってくれるのが自動と考えれば、当然な設計といえる。
自動で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
手動で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
GIMPはOrientationが(1以外に)設定されているjpgファイルを開くときに、次のようにたずねてくる。
ここで[回転]を選択するのを、今回の自動とする。
読んだだけで自動に回転するので、そのまま名前をつけてエクスポートする。エクスポートには、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
上図に示した 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の値は設定されていないので、埋め込まれたままの姿になっている。
詳しい解説はしないので、上のファイル名と見比べて参考にしてほしい。