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


120

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

मैंने इन उदाहरणों के साथ कोशिश की है:

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

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

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

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


अजीब - मैंने सोचा था कि संबंधित आदेश था, convert original.png -transparent white new.pngलेकिन यह कोशिश करने पर, यह काम करने के लिए नहीं मिल सकता है। एक तरफ के रूप में, क्या आप सुनिश्चित हैं कि आपकी पृष्ठभूमि वास्तव में सफेद (#FFFFFF) है, या यह सिर्फ लगभग सफेद है (जैसे #FEFEFE)?
mathematical.coffee

@ गणितीय.कॉफी ठीक है मैं समझता हूं, अगर यह मामला नहीं है तो मुझे जांचने दें और मैं इस धागे को जारी रखूंगा। धन्यवाद।
इज़राइल

@ गणितीय.कोफी हाय फिर से, मैंने रंगों की जाँच की है और इस छवि की पृष्ठभूमि #FFFFFF जैसी है, दूसरे शब्दों में "सफेद"। :( यह मामला नहीं है!
इज़राइल

जवाबों:


140

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

convert test.png -transparent white transparent.png

कि परीक्षण में सभी सफेद बदल दिया है। पारदर्शी करने के लिए।


6
यह मेरे लिए तब तक काम नहीं आया जब तक मुझे एहसास नहीं हुआ कि जेपीजी पारदर्शी नहीं होगा। एक बार जब मैंने पीएनजी पर स्विच किया, तो यह वही हुआ जो मैं चाहता था - बस "सफेद" को "आरजीबी ($ आर, $ जी, $ बी)" में बदलना था।
रोजर ड्यूक

2
हे भगवान! यह महान है!
एगिलोब

2
यह न केवल पृष्ठभूमि को पारदर्शी, बल्कि हर सफेद पिक्सेल में बदल देगा। क्या पृष्ठभूमि को केवल पारदर्शी में बदलने का एक तरीका है?
अलेजांद्रो लोज़्ज़िस्की

2
@AlejandroLozdziejski - आप "पृष्ठभूमि" कैसे निर्धारित कर रहे हैं?
जूल्स

1
@AlejandroLozdziejski: अच्छा सवाल। कृपया मेरा समाधान देखें जो किनारों से एक बाढ़ का उपयोग करता है, शीर्ष-बाएँ पिक्सेल के समान रंगों की तलाश में।
हैकरबी

79

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

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

1) छवि प्रारूप को png में बदलें: convert input.jpg input.png

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


6
यह अच्छा है, पारदर्शी पृष्ठभूमि और अपारदर्शी अग्रभूमि के बीच एक चिकनी बढ़त है। यदि आप JPG में शोर आइकन को PNG में बदलते हैं, और पारदर्शिता जोड़ना चाहते हैं, तो आप कुछ मध्य फ़िल्टरिंग भी जोड़ सकते हैं:mogrify -format png -median 2 -fuzz 5% -transparent white ico_*.jpg
टॉमाज़ गैंडर

44

उपाय

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

सफेद के रूप में पारदर्शी के सरल प्रतिस्थापन हमेशा काम नहीं करता है Antialiased Alphachannel और floodfill ज्यादा बेहतर लगती है

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

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

मेकट्रांस शेल स्क्रिप्ट

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

bg_removal स्क्रिप्ट

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

Bg_removal स्क्रिप्ट: दाढ़ी है, लेकिन इसमें एंटीअलियाजिंग की कमी है


2
मुझे फ़ज़ को 2% संशोधित करने की आवश्यकता थी, क्योंकि छवि में सफेद पृष्ठभूमि के साथ एक सफेद मशीन शामिल है। और यद्यपि यह 100% सही नहीं है, लेकिन यह सबसे अच्छा समाधान है जो मुझे मिला है क्योंकि मैं इसे gimpया जो भी करना चाहता हूं उसे मैनुअल नहीं करना चाहता । :)
tukusejssirs

1
बहुत बढ़िया समाधान!
0x01h

29

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

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

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


1
वाह! मुझे ठीक इसी की आवश्यकता थी! इससे पहले: i.imgur.com/2Rd7w1N.png , इसके बाद: i.imgur.com/4RTYygo.png
डोरियन

यह पूरी तरह से काम नहीं कर रहा है क्योंकि यह सफेद रंग और सफेद पृष्ठभूमि के साथ छवियों को संभालने में असमर्थ है। ट्रम्प फोटो की तरह।
सीनियर पीएचपी प्रोग्रामर टीम लीड

सफेद पर सफेद के लिए, ऊपर दिए गए बाढ़ भराव समाधान का उपयोग करने का प्रयास करें । या मेरी mktransशेल स्क्रिप्ट का उपयोग करें : github.com/hackerb9/mktrans
hackerb9

12

आप इसका उपयोग पृष्ठभूमि को पारदर्शी बनाने के लिए कर सकते हैं

convert test.png -background rgba(0,0,0,0) test1.png

ऊपर प्रीफेक्ट पारदर्शी पृष्ठभूमि देता है


4
शेल को कुछ उद्धरण की आवश्यकता हो सकती है (): convert more-icon.png -gravity center -background 'rgba(0,0,0,0)' -extent 27x27 new-more-icon.png
जिम के।

7

ImageMagick का उपयोग करना, यह hackerb9 कोड और परिणाम के समान है, लेकिन थोड़ी सरल कमांड लाइन है। यह मान लेता है कि शीर्ष बाएँ पिक्सेल पृष्ठभूमि का रंग है। मैं सिर्फ बाढ़ को पारदर्शिता से भरता हूं, फिर अल्फा चैनल का चयन करता हूं और इसे धुंधला करता हूं और 50x100% का उपयोग करके धुंधले क्षेत्र के आधे हिस्से को हटा देता हूं। फिर सभी चैनलों को वापस चालू करें और इसे भूरे रंग के खिलाफ सपाट करें। -Blur 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

यहां छवि विवरण दर्ज करें


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

2
PS मैं एक जंगली अनुमान लगाने जा रहा हूं कि "fmw" फ्रेड एम। वेनहास के लिए है। यदि हां, तो नमस्कार, डॉ। वेनहास! जो कोई नहीं जानता कि वह कौन है, उसने 1970 के दशक में शुरू होने वाले कंप्यूटर ग्राफिक्स में कुछ मौलिक शोध लिखे। हर किसी को fmwconcepts.com/imagemagick पर ImageMagick शेल स्क्रिप्ट के अपने अद्भुत कॉनकोपिया को देखना चाहिए
Hackerb9

1
@ hackerb9: हां, यह मैं हूं। क्या हम एक दूसरे को जानते हैं? अगर आप चाहें तो मुझे एक ईमेल भेजें। मेरा ईमेल पता आपके द्वारा लिंक किए गए मेरे वेब पेज पर है।
fmw42

4

यदि आप पारदर्शिता के स्तर को नियंत्रित करना चाहते हैं तो आप आरजीबीए का उपयोग कर सकते हैं। अल्फ़ा कहाँ है पारदर्शी के लिए 0 और अपारदर्शी के लिए 1। सुनिश्चित करें कि अंतिम आउटपुट फ़ाइल में पारदर्शिता के लिए .png एक्सटेंशन होना चाहिए।

convert 
  test.png 
    -channel rgba 
    -matte 
    -fuzz 40% 
    -fill "rgba(255,255,255,0.5)" 
    -opaque "rgb(255,255,255)" 
       semi_transparent.png

1

हां। यही समस्या थी भी। यहां वह कमांड है जिसे मैंने चलाया था और इसने पूरी तरह से काम किया: convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.