ImageMagickのconvertを使って多数の画像ファイルをトリミング、回転する方法を紹介している。
加えてトリミングや回転などで縦横のピクセル数が変化しても、画像を表示するテレビが変換前の画像の大きさを採用して表示が乱れる、というトラブルにあったので原因調査の過程と一応の対策を述べている。
もちろん環境はLinux(Ubuntu20.04)。bashをはじめ標準的なコマンドを使っているが、パッケージを追加で入れなければならないものもあるかもしれない。下部の追加が必要かもしれないパッケージを参照。
知っていると便利。すべてを知っている必要はないけれど調べるとわかると時々楽ができることがある。
シェルスクリプトでの連続処理の基本はこれ。
for f in *.jpg;do (繰り返すコマンド) ;done
カレントディレクトリ(現在の位置するフォルダ)内のファイル名が".jpg"で終了するもの全てについて(繰り返すコマンド)を実行する。
fは変数で、*.jpgの中から一つずつ代入されて、doとdoneの間の繰り返しのコマンドを実行する。
コマンドでファイル名を使うときには $ をつけて $f とする。変数名はfに限らず好きな文字でよいし複数の文字を組み合わせてもいいが、たぶん英字で始まる英数字の組み合わせなら使える。
*.jpg は N*.jpg とすると Nで始まり.jpg で終わるファイルとなる。こんなので試すとよい。
for f in N*.jpg;do echo $f ;done
echo $f は 引数として受け取った文字列を表示するというコマンド。失敗しても実害がないので for の構文や 変数として認められる文字列か、N*.jpg などが意図通りに目的のファイル名が取得できるかなどの確認ができる。
もっとも、ls N*.jpg でもファイル名の確認はできるのですが。
こんなのも必要な場合がありますかな。
for f in *.[jJ][pP][gG];do echo $f ;done
拡張子が、.jpg でも .JPG でも、(実は .JpG でも) 合致します。
pdfimages は ImageMagick に含まれるものではないですが、今回の失敗で必要になりました。
for f in *.PDF; do pdfimages -j $f ${f%.PDF} ;done
元ファイル
EPSON001.PDF EPSON002.PDF EPSON003.PDF ...
作成されるファイル(元ファイルも残ります)
EPSON001-000.jpg EPSON002-000.jpg EPSON003-000.jpg ...
pdfimages コマンドは -j で jpeg で出力します。
pdfimages -j 入力ファイル名 出力ファイル名 として使います。
出力ファイル名に abc と指定すると、abc-000.jpg というファイルになります。これでは全部が同じ名前になります。
出力ファイル名に $f を使うと、EPSON001.PDF-000.jpg となります。これでも画像ファイルとしては問題ないですが、".PDF"が邪魔です。
${f%.PDF} はそれを取る指定です。$f末尾の".PDF"を取り除くという指示です。
その1でファイル名に000がつくのはそのpdfファイル内に画像が複数あるかもしれないからですが、全部に000がつくのは煩わしい。実は取り出した画像はすべて90度回転させる必要があるので、一つのpdfにまとめてから回転すれば一度にできるし000も連番になるだろうと考えて次のようにしました。
qpdf EPSON001.PDF --pages EPSON00*.PDF -- Eall.pdf qpdf --rotate=270 Eall.pdf Eallyoko.pdf
これで Eallyoko.pdf は複数ページからなるpdfファイルになります。270度時計回りに回転させています。これから画像を取り出します。
pdfimages -j Eallyoko.pdf fpdf
EPSON001.PDF→fpdf-000.jpgと一つずれていますがfpdfという指定文字列に000から始まる連番が付きます。
fpdf-000.jpg fpdf-001.jpg fpdf-002.jpg ...
でもなんと、この画像はすべて回転されておらず、縦長のままでした。
画像データをそのままにして、表示するときに回転するようにしただけでした。
というわけで、画像データは若干の不要部分を削除しなければならず、回転もしなければなりません。元の画像は2480x3507です。これを2415x3412にしたあと回転させます。
トリミングだけなら
for f in *.jpg;do convert $f -crop 2415x3412+0+0 crro$f;done
回転だけなら
for f in *.jpg;do convert $f -rotate 270 crro$f;done
トリミング後回転なら
for f in *.jpg;do convert $f -crop 2415x3412+0+0 -rotate 270 +repage crro$f;done
さらに、exif情報を消去したい場合は、
for f in *.jpg;do convert $f -crop 2415x3412+0+0 -rotate 270 +repage -strip crro$f;done
convert の引数で $f は入力ファイル名。crro$f は出力ファイル名です。cropとrotateから適当に前置する文字列を決めたものです。fpdf-000.jpg はそのまま残り crrofpdf-000.jpg が作成されます。
入力ファイル名 | 出力ファイル名 | |
fpdf-000.jpg fpdf-001.jpg fpdf-002.jpg ... |
⇨ | crrofpdf-000.jpg crrofpdf-001.jpg crrofpdf-002.jpg ... |
入力ファイル名と出力ファイル名を同名にした場合どうなるかはソフトウェアの設計によりますが、加工に失敗してやり直したいときは別名にしておくのが無難です。また、名前を変えるのではなく img2/$f の様にして別のフォルダに入れるのもよくやります。フォルダは予め作っておきます。
2415x3412+0+0 の指定は 横2415px, 縦3412pxに切り詰めるという指定です。+0+0は左上の座標です。つまり+0+0は左と上は切り取ることなく、右側と下側の部分を削除することになります。
rotateは時計回りの角度で指定します。切り取った後に回転しています。逆にする場合は大きさ指定を変える必要があります。
+repageは今回は必要ないはずなのですが、cropなどで画像の大きさを変化させたときに、元の画像の大きさを記憶していると不具合が生じることがあるので実際の画像の大きさに合わせて評価し直す命令ということです。GIMPなどのレイヤーと画像の大きさを合わせる操作に似ているかもしれません。
convertの加工ではexif情報に縦横のピクセル数がオリジナルなまま残っていしまい、実際の画像の大きさとexif情報にずれが生じます。たいていは実際の大きさが採用されるのですが、exif情報を信じ込むソフトウェアもあるので、不都合な場合は消去します。
ファイル名を連番を入れたものに変更するなどの一括変換はWindowsのソフトでは見かけますが、Linuxではあまりみません。コマンドでやってしまえるからです。やり方は人それぞれで自分の得意なコマンドを使うことになりますが、ここではawkを紹介します。awkは解説本を読むと、これでもかという高度な例が紹介されていますが、ここでやっているような軽い使い方が好きです。sedよりもやっていることがわかりやすいと思います。
たとえばこんな感じ
ls *.jpg |awk '{printf "mv %s fpdf%03d.jpg\n",$0,NR}'|sh
最後の |sh を外せば、これからやることが表示されます。
adachi@ebook:work$ ls *.jpg |awk '{printf "mv %s fpdf%03d.jpg\n",$0,NR}' mv fpdf-000.jpg fpdf001.jpg mv fpdf-001.jpg fpdf002.jpg mv fpdf-002.jpg fpdf003.jpg mv fpdf-003.jpg fpdf004.jpg ...
つまり連番を+1しています。
これはforを使いません。合致するファイル名を一気にawkに送ります。awkが一行ずつ処理します。
""の間は書式です。%s と %03d がデータを差し込む穴で、いわゆる差し込み印刷が行われます。
%s はstringで可変長の文字列、%03d はdecimalで3桁の10進数余白は0で埋めるという指示です。
書式の他の文字はそのままprint \nは改行です。
その後の $0 と NR は差し込まれるデータです。$0 は処理中の行の文字列全体をあらわす変数。いまは一つのファイル名が入っています。NR は number of record で 現在処理している行の番号です。1から始まります。
確認したら|shをつければ実行してくれます。
adachi@ebook:work$ ls *.jpg |awk '{printf "mv %s fpdf%03d.jpg\n",$0,NR}'|sh
NRは1から数えられますが、NR-1とすれば0から、NR+1とすれば2からの連番にすることも可能です。
「いや、指定した順番にしたいのだ」という場合はファイル名のリスト(例list)を作っておいて、
cat list|awk '{printf "mv %s fpdf%03d.txt\n",$0,NR}' |sh
とするのがいいでしょう。詳しくはファイル名を指定順に一括変換を参照
今回は上に書いたように、convert を使う際に -strip で exif 情報を取り除くことで一応解決しました。exifを書き換える手もありますが、かなり入り組んだ状況なのであまり触りたくない。Orientationのときに調べてそっとしておくのがよいかと思っています。
あとはテレビでの一覧の表示が遅いので、thumbnailの仕組みがわかるといいかもしれないのですが、テレビとのお付き合いもそう頻繁ではないので、これも後でということにします。
ここから先は遭遇したトラブルの記録。同様の問題を抱えていなければお付き合いくださらなくてもいいと思います。
今回使ったスキャナはEPSONの複合機。普段はWifiで印刷できるのだが、スキャナの利用はUSBで直接繋がなくてはならない。面倒なのでSDを挿してそこに一旦保存することにした。
出力はpdfとjpgの2形式。jpgは必ず2パスでスキャンする。pdfのテキストモードでは1パスなので普段はこちらを使っている。今回はpdfの画像モードでも2パスになることを忘れてうっかりpdfにしてしまったので作業が増えた。
もう一つの失敗は横長にしなかったこと。スキャンの途中で出力の縦横が選択できることに気がついた。基本設定にあってしかるべきだと思うが詳細設定に入っていた。てっきり縦長にしかできないと思っていた。これも作業が増えた原因。
結果、次のような経緯をたどった。
ファイル名 | 説明 | 横×縦(px) | 向き | |
1 | fpdf-nnn.jpg | pdfからjpg抽出 | 2487x3507 | 左辺が下 |
2 | crrofpdf-nnn.jpg | jpgをcropしてrotate(テレビでトラブル) | 3412x2415 | 底辺が下 |
3 | crrostfpdf-nnn.jpg | jpgをcropしてrotateしてstrip | 3412x2415 | 底辺が下 |
次回同様な仕事をするとしたら、こうする。stripはしなくてもいいかもしれない
ファイル名 | 説明 | 横×縦(px) | 向き | |
1 | EPSONnnn.JPG | 横位置でスキャン | 3507x2487 | 底辺が下 |
2 | crstnnn.jpg | cropしてstrip | 3412x2415 | 底辺が下 |
ただしcrop引数の数値は 3412x2415+95+0
あらためてpdfから取り出した画像と、直接jpgで出力したもので違いがないか比較してみる。
つまりEPSON001.PDF⇨fpdf-000.jpgとEPSON002.JPGの比較
adachi@ebook:xjpg$ pdfimages -j EPSON001.PDF fmpdf adachi@ebook:xjpg$ ls -l -rw-r--r-- 1 adachi adachi 5458709 1月 1 2018 EPSON001.PDF -rw-r--r-- 1 adachi adachi 5480854 1月 1 2018 EPSON002.JPG -rw-rw-r-- 1 adachi adachi 5457839 6月 17 10:29 fpdf-000.jpg
ImageMagickにはidentifyというコマンドがある。
adachi@ebook:xjpg$ identify fpdf-000.jpg fpdf-000.jpg JPEG 2480x3507 2480x3507+0+0 8-bit sRGB 5.205MiB 0.000u 0:00.000 adachi@ebook:xjpg$ identify -verbose fpdf-000.jpg Image: fpdf-000.jpg Format: JPEG (Joint Photographic Experts Group JFIF format) Mime type: image/jpeg Class: DirectClass Geometry: 2480x3507+0+0 Resolution: 300x300 Print size: 8.26667x11.69 Units: PixelsPerInch Colorspace: sRGB Type: TrueColor Base type: Undefined Endianess: Undefined Depth: 8-bit Channel depth: red: 8-bit green: 8-bit blue: 8-bit Channel statistics: Pixels: 8697360 Red: min: 0 (0) max: 255 (1) mean: 155.07 (0.608116) standard deviation: 74.8866 (0.293673) kurtosis: -1.32757 skewness: -0.26762 entropy: 0.975189 Green: min: 0 (0) max: 255 (1) mean: 150.695 (0.59096) standard deviation: 76.3137 (0.299269) kurtosis: -1.39529 skewness: -0.14923 entropy: 0.974385 Blue: min: 0 (0) max: 255 (1) mean: 135.697 (0.532147) standard deviation: 82.2054 (0.322374) kurtosis: -1.521 skewness: 0.0645394 entropy: 0.977257 Image statistics: Overall: min: 0 (0) max: 255 (1) mean: 147.154 (0.577075) standard deviation: 77.8019 (0.305105) kurtosis: -1.43699 skewness: -0.125681 entropy: 0.97561 Rendering intent: Perceptual Gamma: 0.454545 Chromaticity: red primary: (0.64,0.33) green primary: (0.3,0.6) blue primary: (0.15,0.06) white point: (0.3127,0.329) Background color: white Border color: srgb(223,223,223) Matte color: grey74 Transparent color: black Interlace: None Intensity: Undefined Compose: Over Page geometry: 2480x3507+0+0 Dispose: Undefined Iterations: 0 Compression: JPEG Quality: 94 Orientation: Undefined Properties: date:create: 2021-06-17T10:29:55+09:00 date:modify: 2021-06-17T10:29:55+09:00 exif:ColorSpace: 1 exif:ComponentsConfiguration: 1, 2, 3, 0 exif:ExifOffset: 176 exif:ExifVersion: 48, 50, 50, 48 exif:FlashPixVersion: 48, 49, 48, 48 exif:ImageDescription: EPSON MFP image exif:Make: SEIKO EPSON CORP. exif:Model: EP-881A Series exif:PixelXDimension: 2480 exif:PixelYDimension: 3507 exif:ResolutionUnit: 2 exif:XResolution: 300/1 exif:YCbCrPositioning: 2 exif:YResolution: 300/1 jpeg:colorspace: 2 jpeg:sampling-factor: 2x1,1x1,1x1 signature: b4859c98680a0b3a9a15f2bee876fa94b502d821fd8bf708ded5ba19372a03c6 Profiles: Profile-exif: 260 bytes Artifacts: filename: fpdf-000.jpg verbose: true Tainted: False Filesize: 5.205MiB Number pixels: 8697360 Pixels per second: 62124000B User time: 0.140u Elapsed time: 0:01.140 Version: ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org
直接のjpgの方は
adachi@ebook:xjpg$ identify EPSON002.JPG EPSON002.JPG JPEG 2480x3507 2480x3507+0+0 8-bit sRGB 5.22695MiB 0.000u 0:00.000 adachi@ebook:xjpg$ identify -verbose EPSON002.JPG Image: EPSON002.JPG Format: JPEG (Joint Photographic Experts Group JFIF format) Mime type: image/jpeg Class: DirectClass Geometry: 2480x3507+0+0 Resolution: 300x300 Print size: 8.26667x11.69 Units: PixelsPerInch Colorspace: sRGB Type: TrueColor Base type: Undefined Endianess: Undefined Depth: 8-bit Channel depth: red: 8-bit green: 8-bit blue: 8-bit Channel statistics: Pixels: 8697360 Red: min: 0 (0) max: 255 (1) mean: 155.132 (0.608361) standard deviation: 74.9492 (0.293918) kurtosis: -1.32517 skewness: -0.26964 entropy: 0.975202 Green: min: 0 (0) max: 255 (1) mean: 150.762 (0.591225) standard deviation: 76.3352 (0.299354) kurtosis: -1.39426 skewness: -0.150301 entropy: 0.974195 Blue: min: 0 (0) max: 255 (1) mean: 135.822 (0.532637) standard deviation: 82.2452 (0.32253) kurtosis: -1.52064 skewness: 0.0634132 entropy: 0.977085 Image statistics: Overall: min: 0 (0) max: 255 (1) mean: 147.239 (0.577407) standard deviation: 77.8432 (0.305267) kurtosis: -1.43599 skewness: -0.126933 entropy: 0.975494 Rendering intent: Perceptual Gamma: 0.454545 Chromaticity: red primary: (0.64,0.33) green primary: (0.3,0.6) blue primary: (0.15,0.06) white point: (0.3127,0.329) Background color: white Border color: srgb(223,223,223) Matte color: grey74 Transparent color: black Interlace: None Intensity: Undefined Compose: Over Page geometry: 2480x3507+0+0 Dispose: Undefined Iterations: 0 Compression: JPEG Quality: 94 Orientation: Undefined Properties: date:create: 2021-06-17T09:49:46+09:00 date:modify: 2018-01-01T09:00:00+09:00 exif:ColorSpace: 1 exif:ComponentsConfiguration: 1, 2, 3, 0 exif:ExifOffset: 176 exif:ExifVersion: 48, 50, 50, 48 exif:FlashPixVersion: 48, 49, 48, 48 exif:ImageDescription: EPSON MFP image exif:Make: SEIKO EPSON CORP. exif:Model: EP-881A Series exif:PixelXDimension: 2480 exif:PixelYDimension: 3507 exif:ResolutionUnit: 2 exif:thumbnail:Compression: 6 exif:thumbnail:JPEGInterchangeFormat: 348 exif:thumbnail:JPEGInterchangeFormatLength: 13237 exif:thumbnail:ResolutionUnit: 2 exif:thumbnail:XResolution: 72/1 exif:thumbnail:YResolution: 72/1 exif:XResolution: 300/1 exif:YCbCrPositioning: 2 exif:YResolution: 300/1 jpeg:colorspace: 2 jpeg:sampling-factor: 2x1,1x1,1x1 signature: 61c777df86c3cc85f49e97eeaaf2ff825188be631cb180475f69fbb034c1cc12 Profiles: Profile-exif: 13591 bytes Artifacts: filename: EPSON002.JPG verbose: true Tainted: False Filesize: 5.22695MiB Number pixels: 8697360 Pixels per second: 57.9824MB User time: 0.150u Elapsed time: 0:01.149 Version: ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org adachi@ebook:xjpg$
比較すると、thumbnailの有無が異なります
adachi@ebook:xjpg$ identify -verbose EPSON002.JPG >idE adachi@ebook:xjpg$ identify -verbose fpdf-000.jpg >idf adachi@ebook:xjpg$ diff idf idE 1c1 < Image: fpdf-000.jpg --- > Image: EPSON002.JPG ・・・省略・・・ 86a87,92 > exif:thumbnail:Compression: 6 > exif:thumbnail:JPEGInterchangeFormat: 348 > exif:thumbnail:JPEGInterchangeFormatLength: 13237 > exif:thumbnail:ResolutionUnit: 2 > exif:thumbnail:XResolution: 72/1 > exif:thumbnail:YResolution: 72/1 94c100 < Profile-exif: 260 bytes --- > Profile-exif: 13591 bytes 96c102 < filename: fpdf-000.jpg --- > filename: EPSON002.JPG 99c105 < Filesize: 5.205MiB --- > Filesize: 5.22695MiB ・・・省略・・・
adachi@ebook:xjpg$ mv EPSON002.JPG EPSON002.jpg adachi@ebook:xjpg$ for f in *.jpg;do convert $f -crop 2415x3412+0+0 -rotate 270 +repage crro$f;done adachi@ebook:xjpg$ ls -l 合計 36428 -rw-r--r-- 1 adachi adachi 5458709 1月 1 2018 EPSON001.PDF -rw-r--r-- 1 adachi adachi 5480854 1月 1 2018 EPSON002.jpg -rw-rw-r-- 1 adachi adachi 5155072 6月 17 11:10 crroEPSON002.jpg -rw-rw-r-- 1 adachi adachi 5132756 6月 17 11:10 crrofpdf-000.jpg -rw-rw-r-- 1 adachi adachi 5457839 6月 17 10:29 fpdf-000.jpg -rw-rw-r-- 1 adachi adachi 2978 6月 17 10:54 idE -rw-rw-r-- 1 adachi adachi 2724 6月 17 10:54 idf
大きさが、2415x3412になっていることはidentifyでもみてとれます。
adachi@ebook:xjpg$ identify crroEPSON002.jpg crroEPSON002.jpg JPEG 3412x2415 3412x2415+0+0 8-bit sRGB 4.91626MiB 0.000u 0:00.000
しかし、exif部分にはPixelXDimensionなどに元の大きさが残っています。crroEPSON002.jpgだけ示しましたが、crrofpdf-000.jpgもthumbnailがないだけで同じです。
adachi@ebook:xjpg$ identify -verbose crroEPSON002.jpg >idcrroE adachi@ebook:xjpg$ grep exif idcrroE exif:ColorSpace: 1 exif:ComponentsConfiguration: 1, 2, 3, 0 exif:ExifOffset: 176 exif:ExifVersion: 48, 50, 50, 48 exif:FlashPixVersion: 48, 49, 48, 48 exif:ImageDescription: EPSON MFP image exif:Make: SEIKO EPSON CORP. exif:Model: EP-881A Series exif:PixelXDimension: 2480 exif:PixelYDimension: 3507 exif:ResolutionUnit: 2 exif:thumbnail:Compression: 6 exif:thumbnail:JPEGInterchangeFormat: 348 exif:thumbnail:JPEGInterchangeFormatLength: 13237 exif:thumbnail:ResolutionUnit: 2 exif:thumbnail:XResolution: 72/1 exif:thumbnail:YResolution: 72/1 exif:XResolution: 300/1 exif:YCbCrPositioning: 2 exif:YResolution: 300/1 Profile-exif: 13591 bytes
上記まででうまく行くはずが、テレビでうまく表示できなかったので、追加作業です。
adachi@ebook:xjpg$ for f in [Ef]*.jpg;do convert $f -crop 2415x3412+0+0 -rotate 270 +repage -strip crrost$f;done adachi@ebook:xjpg$ identify -verbose crrostfpdf-000.jpg >idcrrostf adachi@ebook:xjpg$ identify -verbose crrostEPSON002.jpg >idcrrostE
今までの全ファイルです。
adachi@ebook:xjpg$ ls -l 合計 54580 -rw-r--r-- 1 adachi adachi 5458709 1月 1 2018 EPSON001.PDF -rw-r--r-- 1 adachi adachi 5480854 1月 1 2018 EPSON002.jpg -rw-rw-r-- 1 adachi adachi 5155072 6月 17 11:10 crroEPSON002.jpg -rw-rw-r-- 1 adachi adachi 5132756 6月 17 11:10 crrofpdf-000.jpg -rw-rw-r-- 1 adachi adachi 5141477 6月 17 16:03 crrostEPSON002.jpg -rw-rw-r-- 1 adachi adachi 5132492 6月 17 16:03 crrostfpdf-000.jpg -rw-rw-r-- 1 adachi adachi 5457839 6月 17 10:29 fpdf-000.jpg -rw-rw-r-- 1 adachi adachi 2978 6月 17 10:54 idE -rw-rw-r-- 1 adachi adachi 2986 6月 17 11:34 idcrroE -rw-rw-r-- 1 adachi adachi 2738 6月 17 11:34 idcrrof -rw-rw-r-- 1 adachi adachi 2251 6月 17 16:09 idcrrostE -rw-rw-r-- 1 adachi adachi 2250 6月 17 16:08 idcrrostf -rw-rw-r-- 1 adachi adachi 2724 6月 17 10:54 idf
pdfから加工したものの最終型。exifが消えている
adachi@ebook:xjpg$ diff idcrrof idcrrostf 1c1 < Image: crrofpdf-000.jpg --- > Image: crrostfpdf-000.jpg 74,89c74,75 < date:create: 2021-06-17T11:10:45+09:00 < date:modify: 2021-06-17T11:10:45+09:00 < exif:ColorSpace: 1 < exif:ComponentsConfiguration: 1, 2, 3, 0 < exif:ExifOffset: 176 < exif:ExifVersion: 48, 50, 50, 48 < exif:FlashPixVersion: 48, 49, 48, 48 < exif:ImageDescription: EPSON MFP image < exif:Make: SEIKO EPSON CORP. < exif:Model: EP-881A Series < exif:PixelXDimension: 2480 < exif:PixelYDimension: 3507 < exif:ResolutionUnit: 2 < exif:XResolution: 300/1 < exif:YCbCrPositioning: 2 < exif:YResolution: 300/1 --- > date:create: 2021-06-17T16:03:25+09:00 > date:modify: 2021-06-17T16:03:25+09:00 ・・・省略・・・
jpgから加工したものの最終型。exifが消えている
adachi@ebook:xjpg$ diff idcrroE idcrrostE 1c1 < Image: crroEPSON002.jpg --- > Image: crrostEPSON002.jpg 74,95c74,75 < date:create: 2021-06-17T11:10:45+09:00 < date:modify: 2021-06-17T11:10:45+09:00 < exif:ColorSpace: 1 < exif:ComponentsConfiguration: 1, 2, 3, 0 < exif:ExifOffset: 176 < exif:ExifVersion: 48, 50, 50, 48 < exif:FlashPixVersion: 48, 49, 48, 48 < exif:ImageDescription: EPSON MFP image < exif:Make: SEIKO EPSON CORP. < exif:Model: EP-881A Series < exif:PixelXDimension: 2480 < exif:PixelYDimension: 3507 < exif:ResolutionUnit: 2 < exif:thumbnail:Compression: 6 < exif:thumbnail:JPEGInterchangeFormat: 348 < exif:thumbnail:JPEGInterchangeFormatLength: 13237 < exif:thumbnail:ResolutionUnit: 2 < exif:thumbnail:XResolution: 72/1 < exif:thumbnail:YResolution: 72/1 < exif:XResolution: 300/1 < exif:YCbCrPositioning: 2 < exif:YResolution: 300/1 --- > date:create: 2021-06-17T16:03:24+09:00 > date:modify: 2021-06-17T16:03:24+09:00 ・・・省略・・・
あくまで私が出会ったテレビですが、こんな表示になります。
ファイル名 | 実サイズ | 実画像 | テレビのサムネイル表示 | ep | et | 説明 | ||
1 | fpdf-000.jpg | 2480x3507 | 2480x3507 | 有 | 縦横はexifから、絵は実画像から | |||
2 | crrofpdf-000.jpg | 3412x2415 | 2480x3507 | 有 | 縦横はexifから、絵は実画像から | |||
3 | crrostfpdf-000.jpg | 3412x2415 | 3412x2415 | 正常 | ||||
4 | EPSON002.jpg | 2480x3507 | 2480x3507 | 有 | 有 | 縦横はexifから、絵もexifから | ||
5 | crroEPSON002.jpg | 3412x2415 | 2480x3507 | 有 | 有 | 縦横はexifから、絵もexifから | ||
6 | crrostEPSON002.jpg | 3412x2415 | 3412x2415 | 正常 |
epは"exif:PixelXDimension, PixelYDimension"、etは"exif:thumbnail"です。EPSON複合機のスキャナの仕様として PixelXDimension など画像のサイズがexifに記録されています。加えてjpgならば埋め込みのサムネイルが保存されています。
このテレビはexif情報があればそれを使い、なければ実画像から得ていると理解すれば表示の状態も合点がいきます。ただ、2 のcrrofpdf-000.jpgのサムネイル表示が異様に横方向に縮められているのが謎です。
4,5のサムネイル表示が逆さまなのは、スキャナの仕様上、原稿台の位置で上下左右が固定になっていて、Orientationで向きを記録していると考えられます。
convertコマンドは、上記の使い方ではexif情報を変えないので、齟齬が生じていて、exifをすべて削除すると正常になると言うわけです。
リスト通りに番号をつける一括変換です。
まず、例を作ります。a00,a01,a02,a03 とあるファイルを、a00,a02,a03,a01 の順に b00,b01,b02,b03 としたいと考えましょう。番号の前の文字列をaからbに変えていますが、これをaのままにしたい場合はもうひと工夫必要です。今回はcatの出力をawkで利用するということが主眼です。
adachi@ebook:work$ ls -l *.txt -rw-rw-r-- 1 adachi adachi 9 6月 23 13:18 a00.txt -rw-rw-r-- 1 adachi adachi 2035 6月 23 13:19 a01.txt -rw-rw-r-- 1 adachi adachi 61 6月 23 13:19 a02.txt -rw-rw-r-- 1 adachi adachi 899 6月 23 13:17 a03.txt
まず順番を示すリストが必要です。lsの出力をリダイレクトし、listというファイルを作ります。編集して目的の順にします。
adachi@ebook:work$ ls *.txt > list adachi@ebook:work$ vi list adachi@ebook:work$ cat list a00.txt a02.txt a03.txt a01.txt
ファイル中の出現順に番号を振ります。0からなのでNR-1としました。
adachi@ebook:work$ cat list|awk '{printf "mv %s b%02d.txt\n",$0,NR-1}' mv a00.txt b00.txt mv a02.txt b01.txt mv a03.txt b02.txt mv a01.txt b03.txt
これでよければ、|sh をつけて実行します。
adachi@ebook:work$ cat list|awk '{printf "mv %s b%02d.txt\n",$0,NR-1}'|sh
うまくいったか確認です。ファイルの大きさで確認してください。実は大きさの順にリストを作りました。
adachi@ebook:work$ ls -l *.txt -rw-rw-r-- 1 adachi adachi 9 6月 23 13:18 b00.txt -rw-rw-r-- 1 adachi adachi 61 6月 23 13:19 b01.txt -rw-rw-r-- 1 adachi adachi 899 6月 23 13:17 b02.txt -rw-rw-r-- 1 adachi adachi 2035 6月 23 13:19 b03.txt
ここで使ったコマンドのうち、インストールされていなくてパッケージを追加しなくてはならないかもしれないもの。
特殊なものはないので、aptなどに用意されている。
コマンド | パッケージ | 備考 |
pdfimages | Poppler-utils_ | pdfの連結と回転にqpdfが便利でも紹介 |
qpdf | qpdf | pdfの連結と回転にqpdfが便利でも紹介 |
convert, identify | ImageMagick_ | 不具合か? exifreadでも紹介 |
awk | gawk | 多分標準で入っている |
diff | diffutils | 多分標準で入っている |