png - ImageMagick और कमांडलाइन प्रॉम्प्ट का उपयोग करके पारदर्शी पृष्ठभूमि सेट करें




alpha-transparency (6)

मान लें कि आपके पास कोई छवि है (पीएनजी या जेपीजी)। इस छवि में एक सफेद पृष्ठभूमि है और मुझे इस पृष्ठभूमि को पारदर्शी बनाने की आवश्यकता है।

मैंने इन उदाहरणों के साथ प्रयास किया है:

  • convert original.png -background none transparent.png
  • convert original.png -background white -flatten -alpha off transparent.png

लेकिन कोई वांछनीय परिणाम के साथ।

मैं इसे कैसे बना सकता हूं?

महत्वपूर्ण: कमान कमांड लाइन का उपयोग करना।


उपाय

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) केवल एक रंग के विपरीत पृष्ठभूमि को हटा दिया जाता है। ("पृष्ठभूमि" को चित्र किनारों से बाढ़ का उपयोग करके, शीर्ष बाएं पिक्सेल के समान रंग के रूप में परिभाषित किया गया है।)

इसके अतिरिक्त, हेलो से बचने के लिए अल्फा चैनल भी आधे पिक्सेल से खराब हो जाता है। बेशक, इमेजमैजिक के मॉर्फोलॉजिकल ऑपरेशंस उप-पिक्सेल स्तर पर काम नहीं करते हैं, इसलिए आप देख सकते हैं कि मैं अल्फा चैनल को एरोडिंग से पहले 200% तक उड़ रहा हूं।

परिणामों की तुलना

ImageMagick लोगो पर चलने पर, मेरे समाधान बनाम सरल दृष्टिकोण ("-फज़ 2% -transparent white") की तुलना यहां दी गई है। मतभेदों को स्पष्ट करने के लिए मैंने दोनों पारदर्शी छवियों को एक गलेदार भूरे रंग की पृष्ठभूमि पर चपटा दिया है (मूल के लिए क्लिक करें)।

ध्यान दें कि सरल दृष्टिकोण में जादूगर का दाढ़ी कैसे गायब हो गया है। विज़ार्ड के किनारों की तुलना करने के लिए यह देखने के लिए कि एंटीअलाइज्ड अल्फा पृष्ठभूमि में आसानी से आकृति मिश्रण को कैसे मदद करता है।

बेशक, मैं पूरी तरह से मानता हूं कि ऐसे समय होते हैं जब आप सरल समाधान का उपयोग करना चाहें। (उदाहरण के लिए: यह याद रखने के लिए बहुत आसान है और यदि आप जीआईएफ में परिवर्तित हो रहे हैं, तो आप किसी भी तरह 1-बिट अल्फा तक ही सीमित हैं।)

mktrans खोल स्क्रिप्ट

चूंकि यह असंभव है कि आप इस आदेश को बार-बार टाइप करना चाहते हैं, मैं इसे एक स्क्रिप्ट में लपेटने की अनुशंसा करता हूं। आप github से एक BASH खोल स्क्रिप्ट डाउनलोड कर सकते हैं जो मेरे सुझाए गए समाधान को निष्पादित करता है। इसे किसी निर्देशिका में एकाधिक फ़ाइलों पर चलाया जा सकता है और यदि आप चीजों को ट्विक करना चाहते हैं तो सहायक टिप्पणियां शामिल हैं।

bg_removal स्क्रिप्ट

वैसे, ImageMagick वास्तव में "bg_removal" नामक एक स्क्रिप्ट के साथ आता है जो मेरे समाधान के समान तरीके से बाढ़ भरने का उपयोग करता है। हालांकि, परिणाम बहुत अच्छे नहीं हैं क्योंकि यह अभी भी 1-बिट अल्फा का उपयोग करता है। साथ ही, bg_removal स्क्रिप्ट धीमी गति से चलती है और उपयोग करने के लिए थोड़ा सा ट्रिकियर है (इसके लिए आपको दो अलग-अलग फ़ज़ मान निर्दिष्ट करने की आवश्यकता है)। Bg_removal से आउटपुट का एक उदाहरण यहां दिया गया है।


ImageMagick का उपयोग करके, यह हैकरब 9 कोड और परिणाम के समान है, लेकिन थोड़ा आसान कमांड लाइन है। यह मानता है कि शीर्ष बाएं पिक्सेल पृष्ठभूमि रंग है। मैं सिर्फ पृष्ठभूमि को पारदर्शिता के साथ भरता हूं, फिर अल्फा चैनल का चयन करता हूं और इसे धुंधला करता हूं और -लेवल 50x100% का उपयोग करके धुंधले क्षेत्र के आधे हिस्से को हटा देता हूं। फिर सभी चैनलों पर वापस बारी करें और भूरे रंग के रंग के खिलाफ इसे फ़्लैट करें। -ब्लूर 0x1 -level 50x100% अल्फा चैनल पारदर्शिता की सीमाओं को एंटीअलियास में कार्य करता है। एंटीअलाइजिंग की डिग्री बदलने के लिए आप फ़ज़ मान, धुंध राशि और -वेल 50% मान समायोजित कर सकते हैं।

convert logo: -fuzz 25% -fill none -draw "matte 0,0 floodfill" -channel alpha -blur 0x1 -level 50x100% +channel -background saddlebrown -flatten result.jpg


मुझे भी यही समस्या थी। जिसमें मुझे ImageMagick का उपयोग करके jpg / png छवि प्रारूप से सफेद पृष्ठभूमि को हटाना है।

मेरे लिए क्या काम किया गया था:

1) छवि प्रारूप को पीएनजी में convert input.jpg input.png : convert input.jpg input.png

2) convert input.png -fuzz 2% -transparent white output.png


मैं उबंटू 12.04 पर ImageMagick 6.6.9-7 का उपयोग कर रहा हूं।
मेरे लिए क्या काम किया गया निम्नलिखित था:

convert test.png -transparent white transparent.png

इसने test.png में सभी सफेद को पारदर्शी में बदल दिया।


यह मेरे लिए काम करता है:

convert original.png -fuzz 10% -transparent white transparent.png

जहां फज़% छोटा है, सच्चे सफेद या इसके विपरीत,% जितना बड़ा होगा, सफेद से अधिक भिन्नता पारदर्शी बनने की अनुमति है


हां। यह भी एक ही समस्या थी। यहां आदेश दिया गया आदेश है और यह पूरी तरह से काम करता है: convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico