画像のトリミングと回転などコマンドで一括に

概要

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 でも) 合致します。

pdfから画像を取り出す(その1)

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"を取り除くという指示です。

pdfから画像を取り出す(その2)

その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と直接のjpg

あらためて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
・・・省略・・・

convertをかけます

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

exifを消去したものを作ります

上記まででうまく行くはずが、テレビでうまく表示できなかったので、追加作業です。

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 多分標準で入っている