回答:
あなたの最善の策は、Imagemagickを使用することです
私は実際の使用法の専門家ではありませんが、これに関連する画像はほとんど何でもできることを知っています!
例は次のとおりです。
convert image.png image.jpg
変換された画像を作成するだけでなく、元の画像も保持します。バッチは。Mogrifyツールを使用する必要があると思います(imagemagickの場合は同じコマンドラインから)。これにより、古いイメージが上書きされることに注意してください。
コマンドは次のとおりです。
mogrify -format jpg *.png
mogrify -format jpg -background black -flatten *.png
mogrify -format jpeg img.png
2つのファイルがあり、file img.*
1つのpng、元の未処理、および新しいjpeg ファイルを報告した後、Linuxボックスで@KevinCox 。だから、mogrify
ないではない。この場合には、元のファイルを上書きします。
mogrify
ドキュメントから:「このツールはconvert
、元のイメージファイルが(-formatオプションでファイルサフィックスを変更しない限り)必要な変更で上書きされることを除いて似ています。」
さらにいくつかの解決策があります。
最も簡単なソリューションは、すでに投稿されているほとんどのソリューションと同じです。単純なbash forループ。
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
ls
にとってはより理にかなっているので、おそらく私は自分自身の方法に固執するでしょう。
--
ではなく使用します:::
)。
convert
多くのLinuxディストリビューションで見つかったコマンドはImageMagickのスイートの一部としてインストールされます。convert
ディレクトリ内のすべてのPNGファイルで実行し、その二重拡張子の問題を回避するためのbashコードは次のとおりです。
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
for f in *.png; do convert "$f" "${f/%png/jpg}"; done
最も単純なコマンドだけが必要な場合:
元のファイルを変換して保持する:
mogrify -format jpg *.png
元のファイルの変換と削除:
mogrify -format jpg *.png && rm *.png
ちょっとパーティーに遅れましたが、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
while read
部品を取り除くことです(交換するか、すべて一緒に削除します)
私の迅速な解決策
for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done
for f in ./*.png; do convert "$f" "${f%.*}.jpg"; done
。これはエレガントなバージョンです。それは完全に不要な回避ls
、grep
およびsed
呼び出しを(そしてecho
、しかし、組み込みbashのだとそう/いいえ非常に少ないパフォーマンスへの影響を持つことになりますIIRC)、および2本のパイプと2つのサブシェルを取り除く、およびより少ない入力を必要とします。のすべてのバージョンls
が安全に解析できるわけではないため、わずかにポータブルです。
何年も遅れて、私が作成したこの目的専用の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で動作し、おそらくbourneで動作します。他のシェルについては知りませんが、唯一の違いはループ構文です。
これは、ファイルが複数のディレクトリにまたがるときに変換するために使用するものです。私のオリジナルはTGAから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