画像(PNGまたはJPG)があるとします。この画像の背景は白いため、この背景を透明にする必要があります。
私はこれらの例を試しました:
convert original.png -background none transparent.png
convert original.png -background white -flatten -alpha off transparent.png
しかし、望ましい結果はありません。
どうすればできますか?
重要:convert
コマンドラインを使用します。
Ubuntu 12.04でImageMagick 6.6.9-7を使用しています。
私にとってうまくいったのは次のとおりです。
convert test.png -transparent white transparent.png
これにより、test.pngのすべての白が透明に変わりました。
同じ問題がありました。 ImageMagickを使用してjpg/png画像形式から白い背景を削除する必要があります。
私のために働いたのは:
1)画像形式をpngに変換:convert input.jpg input.png
2)convert input.png -fuzz 2% -transparent white output.png
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」)と私のソリューションの比較を次に示します。両方の透明な画像を色の背景に平らにして、違いをはっきりさせました(オリジナルをクリックします)。
簡単な方法でウィザードのひげがどのように消えたかに注目してください。 Wizardのエッジを比較して、アンチエイリアス処理されたアルファが図が背景にスムーズに溶け込むのにどのように役立つかを確認します。
もちろん、私はあなたがもっと簡単な解決策を使いたいと思う時があることを完全に認めています。 (例:覚えやすいのがずっと簡単です。GIFに変換する場合は、とにかく1ビットアルファに制限されます。)
このコマンドを繰り返し入力する可能性は低いため、スクリプトでラップすることをお勧めします。 githubからBASHシェルスクリプトをダウンロードする で、提案された解決策を実行できます。ディレクトリ内の複数のファイルで実行でき、物事を微調整したい場合に役立つコメントが含まれています。
ちなみに、ImageMagickには、実際には "bg_removal" というスクリプトが付属しています。これは、私のソリューションと同様の方法でFloodfillを使用します。ただし、1ビットアルファを使用するため、結果は大きくありません。また、bg_removalスクリプトの実行は遅くなり、使用するのが少し難しくなります(2つの異なるファズ値を指定する必要があります)。 bg_removalの出力例を次に示します。
これは私のために働く:
convert original.png -fuzz 10% -transparent white transparent.png
ここで、ファズが小さいほど、真の白に近いか、逆に、%が大きいほど、白からの変化がより透明になります。
これを使用して背景を透明にすることができます
convert test.png -background rgba(0,0,0,0) test1.png
上記は、完全な透明な背景を与えます
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
透明度のレベルを制御する場合は、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
うん。これと同じ問題もありました。ここに私が実行したコマンドがあり、それは完全に機能しました:convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico