web-dev-qa-db-ja.com

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

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

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

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

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

どうすればできますか?

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

107
Israel

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

convert test.png -transparent white transparent.png

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

129
Rijk

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

私のために働いたのは:

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

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

71
Sandeep Pal

解決

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

説明

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

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

結果の比較

ImageMagick logo で実行した場合の単純なアプローチ(「-fuzz 2%-transparent white」)と私のソリューションの比較を次に示します。両方の透明な画像を色の背景に平らにして、違いをはっきりさせました(オリジナルをクリックします)。

The simple replacement of white as transparent doesn't always workAntialiased alphachannel and floodfill looks much better

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

もちろん、私はあなたがもっと簡単な解決策を使いたいと思う時があることを完全に認めています。 (例:覚えやすいのがずっと簡単です。GIFに変換する場合は、とにかく1ビットアルファに制限されます。)

mktransシェルスクリプト

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

bg_removalスクリプト

ちなみに、ImageMagickには、実際には "bg_removal" というスクリプトが付属しています。これは、私のソリューションと同様の方法でFloodfillを使用します。ただし、1ビットアルファを使用するため、結果は大きくありません。また、bg_removalスクリプトの実行は遅くなり、使用するのが少し難しくなります(2つの異なるファズ値を指定する必要があります)。 bg_removalの出力例を次に示します。

The bg_removal script: has beard, but lacks antialiasing

32
hackerb9

これは私のために働く:

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

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

25
Ricibald

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

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

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

12

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

enter image description here

5
fmw42

透明度のレベルを制御する場合は、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
4
Gokul N K

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

1
stacigh