誰もがLinuxでPNGの束をJPGにバッチ変換する良い方法を知っていますか?私はUbuntuを使用しています)
シェルスクリプトにドロップするだけのpng2jpgバイナリがあれば理想的です
181 nedned 2009-11-16
あなたの最善の策は、ImageMagickを使用することでしょう
私は実際の使い方の専門家ではありませんが、これがあれば画像関連のことなら何でもできますよね!
例を挙げると
convert image.png image.jpg
これは、変換された画像を作成するだけでなく、オリジナルを保持します
一括変換については、ImageMagickの一部であるMogrifyツールを使用する必要があると思います
古い画像を上書きしてしまうことを念頭に置いておきましょう
コマンドは
mogrify -format jpg *.png
268 William Hilsum 2009-11-16
他にもいくつか解決策があります
最も簡単な方法は、すでに投稿されているほとんどの方法と同じです。ループのためのシンプルなbashです
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
なぜか私はbashでのループを避ける傾向があるので、ここではbashを使って名前の調整をするという、よりUnixyなxargsのアプローチを紹介します
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
私が使っているもの。GNU Parallelを使って複数のジョブを一度に実行し、パフォーマンスを向上させます。多くのシステムにデフォルトでインストールされており、ほぼ間違いなくあなたのレポにあります(周りにあると良いプログラムです)
ls -1 *.png | parallel convert '{}' '{.}.jpg'
ジョブの数は、デフォルトではCPUコアの数になります。私のデュアルコアシステムでは、3つのジョブを使用することで、より良いCPU使用率を発見しました
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
そして、いくつかの統計情報(ETA、完了した仕事、1つの仕事の平均時間…)が必要な場合
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
GNU Parallelを使っている場合は、別の構文もあります
parallel convert '{}' '{.}.jpg' ::: *.png
また、他のいくつかのバージョン (debian を含む) でも同様の構文を使用しています
parallel convert '{}' '{.}.jpg' -- *.png
90 Kevin Cox 2013-01-28
多くの Linux ディストリビューションで見られる convert
コマンドは ImageMagick スイートの一部としてインストールされています。以下はディレクトリ内のすべての PNG ファイルに対して convert
を実行し、二重拡張子の問題を回避するための bash コードです
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
26 Marcin 2009-11-16
tl;dr
シンプルなコマンドが欲しいだけの方に
元のファイルを変換して保存します
mogrify -format jpg *.png
元のファイルを変換して削除します
mogrify -format jpg *.png && rm *.png
バッチ変換について説明します
遅ればせながら、クリに抵抗がある人のために、このように、超簡略化された参考文献と説明を掲載しています
Example Directory
bar.png
foo.png
foobar.jpg
Simple Convert
すべてのオリジナルpngファイルを保持し、jpgファイルを作成します
mogrify -format jpg *.png
Result
bar.png
bar.jpg
foo.png
foo.jpg
foobar.jpg
Explanation
- mogrify は、ImageMagick の画像処理ツール群の一部です
- mogrify は画像をその場で処理するので、
-format
オプションを除いて元のファイルが上書きされます。(サイトより。This tool is similar to convert except that the original image file is overwritten (unless you change the file suffix with the -format option)
)
- mogrify は画像をその場で処理するので、
- format
オプションはフォーマットを変更することを指定し、次の引数には型(この場合はjpg)を指定する必要があります- 最後に、
*.png
は入力ファイル(.pngで終わるすべてのファイル)です
変換と削除
すべてのpngファイルをjpgに変換し、元のファイルを削除します
mogrify -format jpg *.png && rm *.png
Result
bar.jpg
foo.jpg
foobar.jpg
Explanation
- 最初の部分は上記と全く同じで、新しいjpgファイルを作成します
&&
はブール演算子です。要するに、- プログラムが終了すると、終了ステータスを返します。ステータスが
0
の場合は、エラーがないことを意味します &&
は短絡評価を実行するので、右の部分はエラーがなかった場合のみ実行されます。変換にエラーがあった場合、元のファイルを全部削除したくない場合があるので、これは便利です
- プログラムが終了すると、終了ステータスを返します。ステータスが
rm
コマンドはファイルを削除します
Fancy Stuff
さて、クリに馴染んでいる方におススメのグッズをご紹介します
ファイルを変換している間に何らかの出力をしたい場合
for i in *.png; do mogrify -format jpg "$i" && rm "$i"; echo "$i converted to ${i%.*}.jpg"; done
すべてのサブディレクトリにあるすべてのpngファイルを変換し、それぞれのファイルに対して出力します
find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; echo "Converted $i to ${i%.*}.jpg"; done
すべてのサブディレクトリ内のすべてのpngファイルを変換し、結果として得られたすべてのjpgsをall
ディレクトリに入れ、番号を付け、元のpngファイルを削除し、各ファイルの出力をそのまま表示します
n=0; find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; fn="all/$((n++)).jpg"; mv "${i%.*}.jpg" "$fn"; echo "Moved $i to $fn"; done
13 Steven Jeffries 2015-10-17
あなたが探している実際の “png2jpg
” コマンドは、実際には pngtopnm
と cjpeg
という二つのコマンドに分かれていて、それぞれ netpbm
と libjpeg-progs
パッケージに含まれています
png2pnm foo.png | cjpeg > foo.jpeg
8 Teddy 2009-11-16
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
6 emdog4 2014-10-13
私の即効性のある解決策for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done
5 max 2012-05-07
何年も遅かったのですが、この目的のためにpng2jpegというユーティリティがあり、これは私が執筆したものです
マルシンさんのコードを応用しています
#!/bin/sh
for img in *.png
do
filename=${img%.*}
png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
4 user7023624 2016-10-22
バッチ処理用
for img in *.png; do
convert "$img" "$img.jpg"
done
しかし、最終的にはimage1.png.jpgのようなファイル名になってしまいます
これはbashでも動作しますし、ボーンでも動作するかもしれません。他のシェルについては知りませんが、唯一の違いはループ構文でしょう
3 Jeffrey Aylesworth 2009-11-16
ファイルが複数のディレクトリにまたがっているときに変換するときに使うものです。私が使っていたのは TGA から PNG への変換です
find . -name "*.tga" -type f | sed 's/\.tga$//' | xargs -I% convert %.tga %.png
概念としては、必要なファイルをfind
からfind
にして、拡張子を取り除いてからxargs
で元のファイルに戻すというものです。つまり、PNG から JPG への変換では、拡張子を変更して、アルファチャンネルを扱うためにもう一つ余分なことをします、つまり背景を設定して (この例では白ですが、変更できます)、画像を平らにします
find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten %.jpg
1 Archimedes Trajano 2016-09-17
PNGが透過している場合は、変換する前に黒いbgを追加してみてください
mogrify -format jpg -background black -flatten *.png
または白いbg
mogrify -format jpg -background white -flatten *.png
0 Guillaume Chevalier 2020-04-19