解決
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からの出力の例です。
convert original.png -transparent white new.png
が、試してみると動作しない。余談ですが、背景は実際には白(#FFFFFF)ですか、それともほぼ白(例:#FEFEFE)ですか?