シェルスクリプト – linuxでPNGをJPGにバッチ変換する

jpeg linux png shell-script

誰もが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))
  • - 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” コマンドは、実際には pngtopnmcjpeg という二つのコマンドに分かれていて、それぞれ netpbmlibjpeg-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


タイトルとURLをコピーしました