Çözüm
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
açıklama
Bu, daha önce verilen basit cevaplardan biraz daha uzundur, ancak çok daha iyi sonuçlar verir : (1) Kalite, kenar yumuşatılmış alfa nedeniyle üstündür ve (2) tek bir rengin aksine yalnızca arka plan kaldırılır. ("Arka plan", resmin kenarlarından bir su baskını kullanılarak, sol üst pikselle yaklaşık aynı renk olarak tanımlanır.)
Ek olarak, haleleri önlemek için alfa kanalı da yarım piksel aşınmıştır. Elbette, ImageMagick'in morfolojik işlemleri alt piksel düzeyinde (henüz?) Çalışmıyor, bu nedenle aşınmadan önce alfa kanalını% 200'e kadar patlattığımı görebilirsiniz.
Sonuçların karşılaştırılması
ImageMagick logosu üzerinde çalıştırıldığında benim çözümüm ile basit yaklaşımın ("-fuzz% 2 - şeffaf beyaz") bir karşılaştırması
. Farklılıkları belirgin hale getirmek için her iki saydam resmi de kahverengi bir arka plan üzerinde düzleştirdim (orijinaller için tıklayın).
Büyücünün sakalının basit yaklaşımla nasıl kaybolduğuna dikkat edin. Kenarları yumuşatılmış alfa'nın şeklin arka plana sorunsuz bir şekilde karışmasına nasıl yardımcı olduğunu görmek için Sihirbazın kenarlarını karşılaştırın.
Elbette, daha basit çözümü kullanmak isteyebileceğiniz zamanlar olduğunu tamamen kabul ediyorum. (Örneğin: Hatırlaması çok daha kolay ve GIF'e dönüştürüyorsanız, zaten 1 bit alfa ile sınırlısınız.)
mktrans kabuk betiği
Muhtemelen bu komutu tekrar tekrar yazmak istemeyeceğiniz için, onu bir betiğe sarmanızı tavsiye ederim. Şunları yapabilirsiniz github bir BASH shell script indir , önermiş çözüm gerçekleştirir. Bir dizindeki birden fazla dosyada çalıştırılabilir ve bir şeyler ince ayar yapmak istemeniz durumunda yararlı yorumlar içerir.
bg_removal komut dosyası
Bu arada, ImageMagick aslında
benim çözümümle benzer şekilde floodfill kullanan "bg_removal" adlı bir komut dosyasıyla birlikte geliyor
. Ancak sonuçlar hala 1 bitlik alfa kullandığı için harika değil. Ayrıca, bg_removal betiği daha yavaş çalışır ve kullanımı biraz daha zordur (iki farklı fuzz değeri belirlemenizi gerektirir). İşte bg_removal'ın çıktısına bir örnek.
convert original.png -transparent white new.png
ancak bunu denedikten sonra çalışmasını sağlayamıyorum. Bir kenara, arka planınızın gerçekten beyaz (#FFFFFF) olduğundan emin misiniz, yoksa neredeyse beyaz mı (örneğin #FEFEFE)?