สารละลาย
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% ก่อนที่จะสึกกร่อน
การเปรียบเทียบผลลัพธ์
นี่คือการเปรียบเทียบวิธีการที่เรียบง่าย ( "-fuzz 2% โปร่งใสสีขาว") เมื่อเทียบกับวิธีการแก้ปัญหาของฉันเมื่อทำงานบน
โลโก้ ImageMagick ฉันได้แบนภาพโปร่งใสทั้งสองลงบนพื้นหลังสีน้ำตาลอานม้าเพื่อให้เห็นความแตกต่าง (คลิกเพื่อดูต้นฉบับ)
สังเกตว่าเคราของพ่อมดหายไปได้อย่างไรด้วยวิธีง่ายๆ เปรียบเทียบขอบของ Wizard เพื่อดูว่าอัลฟ่าที่ลดรอยหยักช่วยให้ภาพกลมกลืนกับพื้นหลังได้อย่างไร
แน่นอนฉันยอมรับอย่างสมบูรณ์ว่ามีหลายครั้งที่คุณอาจต้องการใช้โซลูชันที่ง่ายกว่านี้ (ตัวอย่างเช่นการจำง่ายกว่ามากและถ้าคุณแปลงเป็น GIF คุณจะ จำกัด อัลฟ่า 1 บิตอย่างไรก็ตาม)
mktrans เชลล์สคริปต์
เนื่องจากไม่น่าจะเป็นไปได้ที่คุณจะต้องการพิมพ์คำสั่งนี้ซ้ำ ๆ ฉันขอแนะนำให้รวมไว้ในสคริปต์ คุณสามารถดาวน์โหลด BASH shell script จาก githubซึ่งดำเนินการตามคำแนะนำของฉัน สามารถเรียกใช้กับไฟล์หลายไฟล์ในไดเร็กทอรีและมีความคิดเห็นที่เป็นประโยชน์ในกรณีที่คุณต้องการปรับแต่งสิ่งต่างๆ
สคริปต์ bg_removal
อย่างไรก็ตาม ImageMagick มาพร้อมกับสคริปต์ที่เรียกว่า
"bg_removal"
ซึ่งใช้การเติมน้ำท่วมในลักษณะที่คล้ายกันกับโซลูชันของฉัน อย่างไรก็ตามผลลัพธ์ไม่ดีนักเนื่องจากยังคงใช้อัลฟ่า 1 บิต นอกจากนี้สคริปต์ bg_removal ยังทำงานช้ากว่าและใช้งานยากกว่าเล็กน้อย (คุณต้องระบุค่า fuzz สองค่าที่แตกต่างกัน) นี่คือตัวอย่างของผลลัพธ์จาก bg_removal
convert original.png -transparent white new.png
แต่เมื่อลองแล้วไม่สามารถใช้งานได้ นอกจากนี้คุณแน่ใจหรือไม่ว่าพื้นหลังของคุณเป็นสีขาว (#FFFFFF) หรือเกือบจะเป็นสีขาว (เช่น #FEFEFE)