web-dev-qa-db-ja.com

LinuxでPNGからJPGへのバッチ変換

LinuxでたくさんのPNGをJPGに一括変換する良い方法を知っている人はいますか? (私はUbuntuを使っています).

シェルスクリプトにドロップできるpng2jpgバイナリが理想的です。

154
nedned

最善の策は、 Imagemagick を使用することです。

私は実際の使用法の専門家ではありませんが、私はあなたがこれに関連した画像をほとんど何でもできることを知っています!

例は次のとおりです。

convert image.png image.jpg

そしてそれは変換された画像を作成するのと同様にオリジナルを保持します。バッチも。私はあなたがMogrifyツールを使う必要があると思います(imagemagickの時と同じコマンドラインから)。これは古い画像を上書きすることに注意してください。

コマンドは以下のとおりです。

mogrify -format jpg *.png  
228
William Hilsum

私はもっ​​といくつか解決策があります。

最も簡単な解決策は、ほとんどがすでに投稿されているようなものです。ループ用の単純な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
76
Kevin Cox

多くのLinuxディストリビューションにあるconvertコマンドは、ImageMagickスイートの一部としてインストールされています。ディレクトリ内のすべてのPNGファイルに対してconvertを実行し、その二重拡張子の問題を回避するためのbashコードは次のとおりです。

for img in *.png; do
    filename=${img%.*}
    convert "$filename.png" "$filename.jpg"
done
25
Marcin

tl; dr

最も単純なコマンドが欲しい人のために:

オリジナルファイルを変換するおよび保持する

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

説明

  • 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)
  • - format オプションは、フォーマットを変更することを指定し、次の引数はタイプ(この場合はjpg)である必要があります。
  • 最後に、*.pngは入力ファイルです(すべてのファイルは.pngで終わります)。

変換と削除

すべてのpngファイルをjpgに変換し、オリジナルを削除します。

mogrify -format jpg *.png && rm *.png

結果

bar.jpg
foo.jpg
foobar.jpg

説明

  • 最初の部分は上記とまったく同じです、それは新しい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
8
Steven Jeffries

探している実際の "png2jpg"コマンドは、実際にはpngtopnmcjpegという2つのコマンドに分割されており、それぞれnetpbmlibjpeg-progsパッケージの一部です。

png2pnm foo.png | cjpeg > foo.jpeg
7
Teddy
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
4
emdog4

私の素早い解決策for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done

3
max

何年も経って、私が書いた、この目的のための png2jpeg ユーティリティがあります。

@Marcinによるコードの修正:

#!/bin/sh

for img in *.png
do
    filename=${img%.*}
    png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
2
user7023624

バッチ処理の場合

for img in *.png; do
  convert "$img" "$img.jpg"
done

Image1.png.jpgのようなファイル名になってしまうでしょう。

これはbashでうまくいくでしょう、そして多分骨が折れるでしょう。私は他のシェルについては知りませんが、唯一の違いはおそらくループ構文でしょう。

2

これは、ファイルが複数のディレクトリにまたがる場合に変換するために使用するものです。私の最初のものは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
0