ImageMagickとコマンドラインプロンプトを使用して透明な背景を設定する


119

画像(PNGまたはJPG)があるとします。この画像の背景は白で、背景を透明にする必要があります。

私はこれらの例で試しました:

  • convert original.png -background none transparent.png
  • convert original.png -background white -flatten -alpha off transparent.png

しかし、望ましい結果はありません。

どうすれば作成できますか?

重要:convertコマンドラインを使用します。


奇妙-関連するコマンドだと思ったconvert original.png -transparent white new.pngが、試してみると動作しない。余談ですが、背景は実際には白(#FFFFFF)ですか、それともほぼ白(例:#FEFEFE)ですか?
mathematical.coffee

@ mathematical.coffeeわかりました。そうでないかどうか確認させてください。このスレッドを続けます。ありがとうございました。
イスラエル

@ mathematical.coffeeこんにちは。色を確認しました。この画像の背景は#FFFFFF、つまり「白」です。:(これは事実ではありません!
イスラエル

回答:


140

Ubuntu 12.04でImageMagick 6.6.9-7を使用しています。
私のために働いたのは次のとおりです:

convert test.png -transparent white transparent.png

これにより、test.pngのすべての白が透明に変わりました。


6
これは、JPGが透明にならないことに気付くまで機能しませんでした。PNGに切り替えると、私が望んだとおりになりました。「白」を「rgb($ r、$ g、$ b)」に変更するだけでした。
Roger Dueck、2016

2
くそったれ!これは素晴らしい!
agilob

2
これは背景を透明に変換するだけでなく、すべての白いピクセルを変換します。背景のみを透明に変換する方法はありますか?
Alejandro Lozdziejski

2
@AlejandroLozdziejski-「背景」をどのように定義していますか?
Jules

1
@AlejandroLozdziejski:いい質問ですね。左上のピクセルとほぼ同じ色を探して、端から塗りつぶしを使用する私のソリューションを参照してください。
hackerb9 2017

79

私も同じ問題を抱えていました。ImageMagickを使用して、jpg / png画像形式から白い背景を削除する必要があります。

私のために働いたのは:

1)画像形式をpngに変換します: convert input.jpg input.png

2) convert input.png -fuzz 2% -transparent white output.png


6
これは、透明な背景と不透明な前景の間のエッジを滑らかにするのに適しています。:あなたはPNGにJPGで騒々しいアイコンを変換、および透明性を追加したい場合は、あなたはまた、いくつかのメディアンフィルタを追加することができますmogrify -format png -median 2 -fuzz 5% -transparent white ico_*.jpg
トマシュGandor

44

解決

color=$( convert filename.png -format "%[pixel:p{0,0}]" info:- )
convert filename.png -alpha off -bordercolor $color -border 1 \
    \( +clone -fuzz 30% -fill none -floodfill +0+0 $color \
       -alpha extract -geometry 200% -blur 0x0.5 \
       -morphology erode square:1 -geometry 50% \) \
    -compose CopyOpacity -composite -shave 1 outputfilename.png

説明

これは、以前に与えられた単純な答えよりも少し長いですが、はるかに良い結果が得られます。(1)アンチエイリアス処理されたアルファにより品質が優れており、(2)単色ではなく背景のみが削除されます。(「背景」は、画像の端からの塗りつぶしを使用して、左上のピクセルとほぼ同じ色として定義されます。)

さらに、アルファチャンネルも半ピクセルで侵食され、ハローを回避します。もちろん、ImageMagickのモルフォロジー演算はサブピクセルレベルでは(まだ?)機能しないため、侵食する前にアルファチャネルを200%に拡大していることがわかります。

結果の比較

これは、ImageMagickロゴで実行した場合の、単純なアプローチ( "-fuzz 2%-transparent white")と私のソリューションの比較 です。両方の透明な画像をサドルブラウンの背景に平らにして、違いをはっきりさせました(オリジナルはクリックしてください)。

透明としての白の単純な置換は常に機能するとは限りません アンチエイリアス処理されたアルファチャンネルと塗りつぶしははるかに良く見えます

簡単なアプローチでウィザードのあごひげがどのように消えたかに注目してください。ウィザードの端を比較して、アンチエイリアスされたアルファがFigureが背景にスムーズに溶け込むのにどのように役立つかを確認します。

もちろん、より簡単なソリューションを使用したい場合があることは完全に認めます。(例:覚えるのは非常に簡単です。GIFに変換する場合は、いずれにしても1ビットアルファに制限されます。)

mktransシェルスクリプト

このコマンドを繰り返し入力することはほとんどないので、スクリプトで囲むことをお勧めします。私の提案する解決策を実行するBASHシェルスクリプトをgithubからダウンロードできます。ディレクトリ内の複数のファイルで実行でき、調整したい場合に役立つコメントが含まれています。

bg_removalスクリプト

ちなみに、ImageMagickには、実際には 私のソリューションと同様の方法でフラッドフィルを使用する「bg_removal」と呼ばれるスクリプトが付属し ています。ただし、1ビットアルファを使用しているため、結果はあまり良くありません。また、bg_removalスクリプトは実行速度が遅く、使用するのが少しトリッキーです(2つの異なるファズ値を指定する必要があります)。これは、bg_removalからの出力の例です。

bg_removalスクリプト:あごひげがありますが、アンチエイリアスがありません


2
画像に白い背景の白いマシンが含まれているため、ファズを2%に変更する必要がありました。これは100%完璧ではありませんが、手動で実行したくないので、私が見つけた最良のソリューションgimpです。:)
tukusejssirs 19/06/15

1
素晴らしいソリューション!
0x01h

29

これは私にとってはうまくいきます:

convert original.png -fuzz 10% -transparent white transparent.png

ファズ%が小さいほど、真の白に近いか、逆に%が大きいほど、白からの変化が透明になることが多くなります。


1
うわー!これはまさに私が必要としたものです!前:i.imgur.com/2Rd7w1N.png、後:i.imgur.com/4RTYygo.png
Dorian

白い色と白い背景の画像を処理できないため、完全には機能しません。トランプの写真のように。
シニアPHPプログラマチームリーダー、

白地に白の場合は、上記で投稿した塗りつぶしソリューションを使用してみてください。または、私のmktransシェルスクリプトを使用します:github.com/hackerb9/mktrans
hackerb9

12

これを使用して背景を透明にすることができます

convert test.png -background rgba(0,0,0,0) test1.png

上記は完全な透明な背景を与えます


4
シェルは、いくつかの引用が必要な場合があります()convert more-icon.png -gravity center -background 'rgba(0,0,0,0)' -extent 27x27 new-more-icon.png
ジム・K.

7

ImageMagickを使用すると、これはhackerb9のコードと結果に非常に似ていますが、コマンドラインが少し単純になります。左上のピクセルが背景色であると想定しています。背景を透明で塗りつぶし、アルファチャネルを選択してぼかし、-level 50x100%を使用してぼかした領域の半分を削除します。次に、すべてのチャネルをオンに戻し、茶色に対して平らにします。-blur 0x1 -level 50x100%は、アルファチャネル透明度の境界をアンチエイリアスするように機能します。ファジー値、ぼかし量、レベル50%値を調整して、アンチエイリアスの程度を変更できます。

convert logo: -fuzz 25% -fill none -draw "matte 0,0 floodfill" -channel alpha -blur 0x1 -level 50x100% +channel -background saddlebrown -flatten result.jpg

ここに画像の説明を入力してください


いいね。要点を簡潔にまとめたところが気に入っています。これは、スクリプトを作成していたときの中間ステップの1つに似ています。(a)鮮明なディテールが失われすぎている、(b)色の選択を明確にして簡単に変更できるようにしたい、(c)上部だけでなくすべてのエッジから塗りつぶしたいため、これに反対しました。 -左の角。(私が今忘れている他のものがあるかもしれません)。
hackerb9 2017

2
PS「fmw」はフレッドM.ウェインハウスの略だと思います。もしそうなら、あいさつ、ヴァインハウス博士!彼が誰であるかを知らない人のために、彼は1970年代に始まったコンピュータグラフィックスのいくつかの独創的な研究を書きました。誰もがでImageMagickのシェルスクリプトの彼の素晴らしいconucopiaをチェックアウトする必要がありますfmwconcepts.com/imagemagick
hackerb9 2017

1
@ hackerb9:はい、それは私です。私たちはお互いを知っていますか?よろしければメールを送ってください。私のメールアドレスはあなたがリンクした私のウェブページにあります。
fmw42

4

透明度のレベルを制御したい場合は、rgbaを使用できます。ここで、aはアルファです。透明の場合は0、不透明の場合は1。透明にするために、最終出力ファイルの拡張子が.pngであることを確認してください。

convert 
  test.png 
    -channel rgba 
    -matte 
    -fuzz 40% 
    -fill "rgba(255,255,255,0.5)" 
    -opaque "rgb(255,255,255)" 
       semi_transparent.png

1

うん。これと同じ問題もありました。これが私が実行したコマンドで、完全に機能しました: convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.