Linuxでの画像フォーマットのバッチ変換
1. 概要
画像をある形式から別の形式に変換する必要がある場合があります。 ファイルサイズを小さくするか、特定の目的のために特定の形式の要件を満たすことができます。
このチュートリアルでは、一連のファイルをある形式から別の形式にバッチ変換する方法を確認します。
2. mogrifyコマンドの使用
ある形式から別の形式に画像を変換するには、mogrifyコマンドを使用できます。これは、画像操作のすべてのニーズに対応するImageMagickの優れたツールです。 フォーマット変換とは別に、画像ファイルのトリミング、サイズ変更、ぼかし、反転、結合、およびその他の多くの操作もサポートしています。
使用法は次のとおりです。
mogrify [options] input-file
PNGファイルをJPG形式に変換してみましょう。
$ ls
Tracks1.png Tracks2.png
$ mogrify -format jpg *.png
$ ls
Tracks1.jpg Tracks1.png Tracks2.jpg Tracks2.png
$ file Tracks1.jpg
Tracks1.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 800x718, frames 3
上で見たように、いくつかのPNGファイルがあります。 次に、それらに対してmogrifyコマンドを実行しました。 このコマンドでは、 -format オプションを使用して、出力形式をJPGとして指定しました。 その結果、新しく作成されたJPGファイルを見ることができます。 また、 file コマンドを使用して、結果のファイルがJPG形式であることを確認しました。
通常、
3. convertコマンドの使用
mogrifyコマンドと同様に、convertコマンドもさまざまな画像処理技術をサポートしています。これはImageMagickのさらに別のツールです。
mogrify コマンドがファイルを編集している間、convertコマンドは結果を新しいファイルに入れます。
使用法は次のとおりです。
convert [input-options] input-file [output-options] output-file
このコマンドの動作を見てみましょう。
$ convert *.png Tracks.jpg
$ ls
Tracks-0.jpg Tracks-1.jpg Tracks1.png Tracks2.png
$ file Tracks-0.jpg
Tracks-0.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 800x718, frames 3
上記のコマンドでは、すべてのPNGファイルを入力として使用しました。 また、出力には、 ajpg拡張子の付いたファイル名を記載しました。 これにより、プレフィックスとして Tracks を使用し、サフィックスとしてゼロから始まる番号を使用して、新しいJPGファイルを作成します。
その結果、異なるファイル名で新しく作成されたJPGファイルを見ることができます。 また、 file コマンドを使用して、新しく生成されたファイルがJPG形式であることを確認しました。
mogrify コマンドは、その場でファイルを編集するという事実から、より効率的で、バッチ処理により適しています。
一方、 convert コマンドは、メモリへの入力内のすべてのファイルを読み取り、処理を実行します。 したがって、ファイルがたくさんあるディレクトリからコマンドを実行すると、メモリの問題が発生する可能性があります。
ただし、 convertコマンドは、出力に別の宛先またはファイル名を指定できるという点でより用途が広いです。さらに、合成およびアニメーション用の複数の画像を処理する場合に適しています。
3.1. GIF形式への変換
上記のコマンドを使用して画像ファイルをGIF形式に変換すると、フォルダー内のすべてのPNGファイルが取得され、単一のGIFファイルが作成されます。ほとんどのシナリオでは、これが予想されます。 ただし、場合によっては、各PNGファイルを個別のGIFファイルに変換する必要があります。
これにより、convertコマンドの名前マングリング機能も確認できます。これはバッチ操作中に不可欠です。
それを確認しましょう:
$ convert *.png -set filename:fn '%t' +adjoin '%[filename:fn].gif'
$ ls
Tracks1.gif Tracks1.png Tracks2.gif Tracks2.png
$ file Tracks1.gif
Tracks1.gif: GIF image data, version 89a, 800 x 718
上記の結果からわかるように、個別のGIFファイルが作成されています。
使用したさまざまなオプションを確認してみましょう。
- -set :設定を指定します
- ファイル名:ファイル名の設定を行っています。 これは最終的に出力ファイル名を作成するために使用されます
- fn :識別用のラベル
- %t :これは拡張子のないファイル名を表します
- + adjoin :このオプションは、入力ファイルごとに個別のファイル名を作成します
- %[filename:fn] .gif :これは最終的なGIFファイル名を生成するためのパーセントエスケープです
これまで、mogrifyコマンドまたはconvertコマンドを使用してフォーマットを変更するさまざまな方法を見てきました。 これらをLinuxの他のコマンドと組み合わせると、ファイルの処理がより柔軟になります。 また、Bashコマンドを使用すると、convertコマンドの複雑さを学ぶ時間を節約できます。
それらのいくつかを簡単に見てみましょう。
3.2. forループの使用
forループを使用してバッチ変換を実行する方法を確認しましょう。
$ for f in *.png ; do convert "$f" "${f%.*}.jpg" ; done
$ ls
Tracks1.jpg Tracks1.png Tracks2.jpg Tracks2.png
上記のコマンドでは、すべてのPNGファイルを繰り返し処理しました。 次に、ファイルを1つずつconvertコマンドに渡しました。 最後に、すべてのファイルをJPG形式に変換しました。
3.3. lsコマンドの使用
lsコマンドとxargsコマンドを組み合わせて、バッチ変換を実行できます。
それを見てみましょう:
$ ls -1 *.png | xargs -n 1 bash -c 'convert $0 "${0%.*}.jpg"'
$ ls
Tracks1.jpg Tracks1.png Tracks2.jpg Tracks2.png
上記の結果から、JPGファイルが正しく作成されていることがわかります。
3.4. findコマンドの使用
次に、findコマンドの使用方法を確認しましょう。
$ find . -name '*.png' | xargs -n 1 bash -c 'convert $0 "${0%.*}.jpg"'
$ ls
Tracks1.jpg Tracks1.png Tracks2.jpg Tracks2.png
これは、上記のコマンドと非常によく似ています。 ls コマンドの代わりに、findコマンドを使用してファイルを取得しました。
3.5. parallelコマンドの使用
何かをバッチで実行する必要があるときはいつでも、parallelコマンドが便利です。
$ ls -1 *.png | parallel convert '{}' '{.}.jpg'
$ ls
Tracks1.jpg Tracks1.png Tracks2.jpg Tracks2.png
ここでも、新しく作成されたJPGファイルを見ることができます。
4. FFMpegの使用
最後に、FFMpegを使用してPNGファイルをJPG形式に変換しましょう。 ご存知のように、FFMpegはさまざまなマルチメディアタスクを実行するために使用されます。これを使用して、画像をある形式から別の形式に変換できます。
それを実行してみましょう:
$ for i in *.png ; do ffmpeg -i "$i" "${i%.*}.jpg" ; done
$ ls
Tracks1.jpg Tracks1.png Tracks2.jpg Tracks2.png
$ file Tracks1.jpg
Tracks1.jpg: JPEG image data, baseline, precision 8, 800x718, frames 3
ここでは、forループを使用してファイルを反復処理しました。 次に、ファイルを1つずつffmpegコマンドに渡しました。 最後に、 ffmpeg コマンドは、出力ファイル名拡張子として jpg を指定しているため、それらをJPG形式に変換します。
5. 結論
このチュートリアルでは、画像ファイルをある形式から別の形式にバッチ変換するさまざまな方法を見てきました。
これまで見てきたように、convertコマンドは必要なすべての変換を処理できます。 これをBashコマンドと組み合わせると、変換プロセスをより細かく制御できます。