web-dev-qa-db-ja.com

ディレクトリ内のすべての画像をjpgに変換するにはどうすればよいですか?

1 2 3 4 ...という名前の連続したディレクトリに非常に多くの異なる画像があります。それらすべてをjpgに変換し、アスペクト比を維持せずに900x900にサイズ変更できるかどうか疑問に思っていました。

最初の部分で試したことは:

$ mogrify -format jpg -- *

しかし、これを行うと、メモリ使用量が急激に増加し、プロセスが強制終了します。 サイズ変更を試みたのは:

$ mogrify -resize 900x900 -- *
mogrify: insufficient image data in file `109.jpg' @ error/jpeg.c/ReadJPEGImage/1039.
mogrify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.
mogrify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.
mogrify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.
mogrify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.

前述したように、ファイルの名前は連番です。私は次のものも持っています:

$ file * | grep -Po "^\d*: *\K[^:,]*(?=,)" | sort | uniq
ASCII text
GIF image data
JPEG image data
PNG image data

だから問題は何ですか?どうすれば修正できますか?

2

ImageMagickのconvertツールを使用することをお勧めします。

convert input.png -resize 900x900 output.jpg

-resizeオプションはかなり明白で、出力ファイル形式はファイル名拡張子を使用して自動的に決定されます。

現在のディレクトリ内のすべてのファイルでこれを実行するには、これを試してください:

for inputfile in ./* ; do
    outputfile="${inputfile%.*}.jpg"
    convert "$inputfile" -resize 900x900 "$outputfile" &&
    [[ -e "$outputfile" && "$inputfile" != "$outputfile" ]] && rm "$inputfile"
done

これにより、現在のディレクトリからすべてのファイルが取得され(ファイルの種類に関係なく)、入力ファイルごとに古い拡張子を削除して「.jpg」を追加することにより、それぞれの出力ファイル名が作成されます。次に、上記のconvertを使用して画像のサイズを変更および変換します。これにより、新しいファイルが作成され、元のファイルはそのまま残ります。それが成功した場合(&&)、出力ファイルが存在するかどうか、入力ファイル名が出力ファイル名と異なるかどうかを確認します(たとえば、元のファイルの1つが既にjpgだった場合)。これらの条件が満たされた場合、入力ファイルを削除できると仮定します。

6
Byte Commander