Larutan
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
Penjelasan
Ini agak lebih panjang daripada jawaban sederhana yang diberikan sebelumnya, tetapi memberikan hasil yang jauh lebih baik: (1) Kualitas lebih unggul karena alfa antialiased, dan (2) hanya latar belakang yang dihilangkan dibandingkan dengan satu warna. ("Latar Belakang" didefinisikan sebagai warna yang kira-kira sama dengan piksel kiri atas, menggunakan isi banjir dari tepi gambar.)
Selain itu, saluran alfa juga terkikis setengah piksel untuk menghindari lingkaran cahaya. Tentu saja, operasi morfologi ImageMagick belum (belum?) Bekerja pada tingkat subpiksel, jadi Anda dapat melihat saya meledakkan saluran alfa hingga 200% sebelum terkikis.
Perbandingan hasil
Berikut adalah perbandingan pendekatan sederhana ("-fuzz 2% -transparent white") versus solusi saya, saat dijalankan pada
logo ImageMagick . Saya telah meratakan kedua gambar transparan ke latar belakang coklat pelana untuk membuat perbedaan terlihat jelas (klik untuk aslinya).
Perhatikan bagaimana janggut Wizard menghilang dalam pendekatan sederhana. Bandingkan tepi Wizard untuk melihat bagaimana antialiased alpha membantu gambar berbaur dengan mulus ke latar belakang.
Tentu saja, saya sepenuhnya mengakui ada kalanya Anda mungkin ingin menggunakan solusi yang lebih sederhana. (Misalnya: Jauh lebih mudah untuk diingat dan jika Anda mengonversi ke GIF, Anda terbatas pada alfa 1-bit.)
mktrans shell script
Karena tidak mungkin Anda ingin mengetik perintah ini berulang kali, saya sarankan untuk membungkusnya dalam skrip. Anda dapat mengunduh skrip shell BASH dari github yang melakukan solusi yang saya sarankan. Ini dapat dijalankan pada banyak file dalam sebuah direktori dan menyertakan komentar yang berguna jika Anda ingin mengubah sesuatu.
bg_removal script
Ngomong-ngomong, ImageMagick sebenarnya hadir dengan skrip bernama
"bg_removal"
yang menggunakan floodfill dengan cara yang sama seperti solusi saya. Namun hasilnya kurang bagus karena masih menggunakan alpha 1-bit. Selain itu, skrip bg_removal berjalan lebih lambat dan sedikit lebih rumit untuk digunakan (Anda harus menentukan dua nilai fuzz yang berbeda). Berikut adalah contoh keluaran dari bg_removal.
convert original.png -transparent white new.png
tetapi setelah mencobanya, tidak dapat membuatnya berfungsi. Selain itu, apakah Anda yakin latar belakang Anda benar-benar putih (#FFFFFF), atau hampir putih (mis. #FEFEFE)?