LinuxでたくさんのPNGをJPGに一括変換する良い方法を知っている人はいますか? (私はUbuntuを使っています).
シェルスクリプトにドロップできるpng2jpgバイナリが理想的です。
最善の策は、 Imagemagick を使用することです。
私は実際の使用法の専門家ではありませんが、私はあなたがこれに関連した画像をほとんど何でもできることを知っています!
例は次のとおりです。
convert image.png image.jpg
そしてそれは変換された画像を作成するのと同様にオリジナルを保持します。バッチも。私はあなたがMogrifyツールを使う必要があると思います(imagemagickの時と同じコマンドラインから)。これは古い画像を上書きすることに注意してください。
コマンドは以下のとおりです。
mogrify -format jpg *.png
私はもっといくつか解決策があります。
最も簡単な解決策は、ほとんどがすでに投稿されているようなものです。ループ用の単純なbash。
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
何らかの理由で、私はbashでループを避ける傾向があるので、ここでは名前マングリングにbashを使用する、より変わったxargsアプローチがあります。
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
私が使っているもの。これはGNU Parallelを使用して一度に複数のジョブを実行するため、パフォーマンスが向上します。これは多くのシステムにデフォルトでインストールされており、ほぼ間違いなくあなたのリポジトリに入っています(周りに持っているのは良いプログラムです)。
ls -1 *.png | parallel convert '{}' '{.}.jpg'
ジョブの数はデフォルトであなたが持っているプロセスの数になります。私のデュアルコアシステムでは、3つのジョブを使用してCPU使用率が向上しました。
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
そして、あなたがいくつかの統計(ETA、仕事が完了した、仕事あたりの平均時間...)が欲しいなら
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
GNU Parallelを使用している場合は、代替構文もあります。
parallel convert '{}' '{.}.jpg' ::: *.png
そして他のいくつかのバージョン(debianを含む)のための同様の構文。
parallel convert '{}' '{.}.jpg' -- *.png
多くのLinuxディストリビューションにあるconvert
コマンドは、ImageMagickスイートの一部としてインストールされています。ディレクトリ内のすべてのPNGファイルに対してconvert
を実行し、その二重拡張子の問題を回避するためのbashコードは次のとおりです。
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
最も単純なコマンドが欲しい人のために:
オリジナルファイルを変換するおよび保持する:
mogrify -format jpg *.png
オリジナルファイルを変換および削除します。
mogrify -format jpg *.png && rm *.png
Kindaはパーティーに遅刻しましたが、cliにあまり慣れていないかもしれない人のための混乱のすべてを片付けるために、ここに超控えめな参照と説明があります。
ディレクトリ例
bar.png
foo.png
foobar.jpg
オリジナルのpngファイルをすべて保持し、jpgファイルを作成します。
mogrify -format jpg *.png
結果
bar.png
bar.jpg
foo.png
foo.jpg
foobar.jpg
説明
-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)
)- format
オプションは、フォーマットを変更することを指定し、次の引数はタイプ(この場合はjpg)である必要があります。*.png
は入力ファイルです(すべてのファイルは.pngで終わります)。すべてのpngファイルをjpgに変換し、オリジナルを削除します。
mogrify -format jpg *.png && rm *.png
結果
bar.jpg
foo.jpg
foobar.jpg
説明
&&
はブール演算子です。要するに:0
のステータスはエラーがないことを意味します。&&
は短絡評価 を実行するので 、エラーがない場合にのみ右側部分が実行されます。変換中にエラーが発生した場合は、元のファイルをすべて削除したくない場合があるため、これは便利です。rm
コマンドはファイルを削除します。今度はcliに慣れている人々のためのいくつかの良い点があります。
ファイル変換中に何らかの出力が必要な場合は、
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ファイルを変換し、作成されたすべてのjpgを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
探している実際の "png2jpg
"コマンドは、実際にはpngtopnm
とcjpeg
という2つのコマンドに分割されており、それぞれnetpbm
とlibjpeg-progs
パッケージの一部です。
png2pnm foo.png | cjpeg > foo.jpeg
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
私の素早い解決策for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done
何年も経って、私が書いた、この目的のための png2jpeg ユーティリティがあります。
@Marcinによるコードの修正:
#!/bin/sh
for img in *.png
do
filename=${img%.*}
png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
バッチ処理の場合
for img in *.png; do
convert "$img" "$img.jpg"
done
Image1.png.jpgのようなファイル名になってしまうでしょう。
これはbashでうまくいくでしょう、そして多分骨が折れるでしょう。私は他のシェルについては知りませんが、唯一の違いはおそらくループ構文でしょう。
これは、ファイルが複数のディレクトリにまたがる場合に変換するために使用するものです。私の最初のものはTNG to PNGでした
find . -name "*.tga" -type f | sed 's/\.tga$//' | xargs -I% convert %.tga %.png
コンセプトは、あなたが必要なファイルをfind
し、拡張子を取り除き、そしてそれをxargs
で再び追加することです。 PNGからJPGへの変換では、拡張子を変更してアルファチャンネルを処理するための追加の1つのこと、つまり背景を設定する(この例では白ですが、変更することができます)、そしてイメージをフラットにします。
find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten %.jpg