उपाय
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) केवल पृष्ठभूमि को एक रंग के विपरीत हटा दिया जाता है। ("बैकग्राउंड" को चित्र के किनारों से फ्लडफ़िल का उपयोग करके लगभग शीर्ष बाएँ पिक्सेल के समान रंग के रूप में परिभाषित किया गया है।)
इसके अतिरिक्त, अल्फा चैनल भी halos से बचने के लिए आधे पिक्सेल से मिट जाता है। बेशक, ImageMagick के रूपात्मक ऑपरेशन (अभी तक?) सबपिक्सल स्तर पर काम नहीं करते हैं, इसलिए आप देख सकते हैं कि मैं अल्फा चैनल को इरोड करने से पहले 200% तक उड़ा रहा हूं।
परिणामों की तुलना
यहाँ ImageMagick लोगो पर चलने पर सरल उपाय ("-fuzz 2% -transparent white") बनाम मेरे समाधान की तुलना की गई है
। मैंने अंतर को स्पष्ट करने के लिए (मूल के लिए क्लिक करें) एक काठी भूरी पृष्ठभूमि पर दोनों पारदर्शी छवियों को चपटा किया है।
ध्यान दें कि सरल दृष्टिकोण में विज़ार्ड की दाढ़ी कैसे गायब हो गई है। विज़ार्ड के किनारों की तुलना करके देखें कि कैसे एंटीअलियास अल्फा अल्फा को पृष्ठभूमि में आसानी से मिश्रण करने में मदद करता है।
बेशक, मैं पूरी तरह से मानता हूं कि कई बार आप सरल समाधान का उपयोग करना चाहते हैं। (उदाहरण के लिए: यह याद रखना बहुत आसान है और यदि आप GIF में परिवर्तित कर रहे हैं, तो आप 1-बिट अल्फा स्कोमो तक सीमित हैं।)
मेकट्रांस शेल स्क्रिप्ट
चूंकि यह संभावना नहीं है कि आप इस कमांड को बार-बार लिखना चाहते हैं, इसलिए मैं इसे स्क्रिप्ट में लपेटने की सलाह देता हूं। आप github से BASH शेल स्क्रिप्ट डाउनलोड कर सकते हैं जो मेरे सुझाए गए समाधान को पूरा करती है। यह एक डायरेक्टरी में कई फाइलों पर चलाया जा सकता है और इसमें उन चीजों को शामिल करने में मददगार है जो आप चीजों को ट्विट करना चाहते हैं।
bg_removal स्क्रिप्ट
वैसे, ImageMagick वास्तव में "bg_removal" नामक एक स्क्रिप्ट के साथ आता है
जो मेरे समाधान के रूप में इसी तरह से बाढ़ का उपयोग करता है। हालांकि, परिणाम महान नहीं हैं क्योंकि यह अभी भी 1-बिट अल्फा का उपयोग करता है। इसके अलावा, bg_removal स्क्रिप्ट धीमी चलती है और उपयोग करने के लिए थोड़ा पेचीदा है (इसके लिए आपको दो अलग-अलग फ़ज़ मूल्यों को निर्दिष्ट करने की आवश्यकता होती है)। यहाँ bg_removal से आउटपुट का एक उदाहरण दिया गया है।
convert original.png -transparent white new.png
लेकिन यह कोशिश करने पर, यह काम करने के लिए नहीं मिल सकता है। एक तरफ के रूप में, क्या आप सुनिश्चित हैं कि आपकी पृष्ठभूमि वास्तव में सफेद (#FFFFFF) है, या यह सिर्फ लगभग सफेद है (जैसे #FEFEFE)?