2012-04-20 8 views
14

मैं एंड्रॉइड ColorFilters के साथ किसी समस्या को हल करने का प्रयास कर रहा हूं। दस्तावेज़ीकरण बहुत खराब है, इसलिए मुख्य विधि विभिन्न रूपों का प्रयास कर रही है।एंड्रॉइड कलरफिल्टर - पोर्टर-डफ मोड

समस्या:

एक बिटमैप है। कुछ पिक्सल में अल्फा = 255 है, अन्य में अल्फा = 0 है। मैं एक विशिष्ट रंग के साथ एक सर्कल आकर्षित करने की कोशिश कर रहा हूँ। मैं अल्फा चैनल बिटमैप में अपरिवर्तित चाहता हूं, लेकिन ड्राइंग करते समय मैं बिटमैप-अल्फा में एक रंग गुणा करना चाहता हूं।

तो, एक सर्कल ड्राइंग करते समय मैं पिक्सेल को अल्फा = 0 के साथ पेंट करना चाहता हूं, लेकिन अल्फा = 255 के साथ पिक्सल को रंग में पेंट किया जाना चाहिए जो मैं चाहता हूं। अल्फा चैनल नहीं बदला जाना चाहिए।

मैं पोर्टर-डफ कलरफिल्टर (एंड्रॉइड एसडीके में पोर्टरडफ कॉलरफिल्टर क्लास) का उपयोग करने की कोशिश कर रहा हूं।

भी कई मोड और यहाँ आधिकारिक साइट पर कोई-समझा जा सकता वर्णन देखते हैं: http://developer.android.com/reference/android/graphics/PorterDuff.Mode.html

मुझे लगता है मैं DST_ATOP या SRC_ATOP का उपयोग करना चाहिए, लेकिन जैसा कि मैंने वर्णित वे काम नहीं करते।

इसके अलावा, पोर्टर-डफ रंगफिल्टर के निर्माता में srcColor एक अजीब पैरामीटर है।

मुझे समझ में नहीं आता कि "सा" और "एससी" का अर्थ सूत्रों में क्या है [Da, Sc * Da + (1 - Sa) * Dc]। यह रंग से हो सकता है जो रंगफिल्टर कन्स्ट्रक्टर में पारित किया गया था और यह "paint.setcolor" द्वारा रंग सेट भी हो सकता है।

कोई जानता है, यह कैसे काम करता है?

+0

आप इन मोडों का अर्थ देखने के लिए पोर्टर डफ को Google पर जा सकते हैं। – Renard

+1

यह महान दस्तावेज़ छवियों के साथ पोर्टरडफ मोड्स को बताता है: http://ssp.impulsetrain.com/porterduff.html बस जागरूक रहें कि यह एंड्रॉइड की तरह "src_" नहीं जोड़ता है: इसलिए "IN" = "SRC_IN" –

उत्तर

10

Sa और Sc "स्रोत अल्फा" और "स्रोत रंग" के लिए शॉर्ट्स, क्रमशः रहे हैं। पैरामीटर PorterDuffColorFilter कन्स्ट्रक्टर में इन मानों के लिए उपयोग किया गया रंग है।

आपके मामले के लिए Mode.MULTIPLY शायद सबसे अच्छा काम करेगा।

+0

लेकिन कैसे paint.setColor इस पर प्रभाव डालता है? मैंने इसे बदलने की कोशिश की और समझ लिया कि यह प्रभावित करता है! मुझे लगता है कि यह ऐसे मिश्रण सूत्रों में होना चाहिए? – user1038085

+0

इसके अलावा, इस मामले में गुणा मोड काम नहीं करता है। शून्य अल्फा चैनल वाले पिक्सेल भी चित्रित किए गए हैं :( – user1038085

+0

मुझे इस भाग के बारे में पूरी तरह से यकीन नहीं है, लेकिन मुझे लगता है कि यदि आप अपने पेंट पर रंग सेट करते हैं, तो यह मान किसी भी समय src/dst तर्कों में से किसी एक में शामिल किया जाएगा ऐसा लगता है कि रंग अल्फा को आपके मामले में गणना में भी लिया जाता है, जिससे सबकुछ एक ठोस 1.0-अल्फा बना रहता है। आपको पेंट पर रंग सेट किए बिना बिटमैप खींचने का प्रयास करना चाहिए। – Jave

5

ध्यान दें कि पोर्टर-डफ मोड को केवल पूर्ववर्ती अल्फा के साथ ठीक से काम करने के लिए परिभाषित किया गया है। इसका मतलब है कि आर, जी या बी घटक में से कोई भी अल्फा मान से अधिक नहीं हो सकता है।

GitHub project एंड्रॉइड प्रोजेक्ट के लिए जो सभी पोर्टर-डफ मोड दिखाता है। Play12ore पर Android App भी उपलब्ध है।

+0

कैसे पढ़ा जाए, यह दिखाता है कि सूत्र कैसे छवियों को अच्छी तरह से प्रभावित करते हैं। बेहतर होगा यदि आप कुछ सरल छवियां शामिल करते हैं एक विकल्प के रूप में। –

1

कुछ शोध करने के बाद मैं Android में PorterDuff रंग मोड के बारे में निम्नलिखित निष्कर्ष के लिए आया था,

  • सा और एससी हैं स्रोत अल्फा और स्रोत का रंग, उदा अगर मैं ColorDilter को myDrawable.setColorFilter (वांछित रंग, मोड.SRC_ATOP) जैसे ड्रॉ करने योग्य पर सेट कर रहा हूं, तो Sa और Sc मानों को वांछित से लिया जाएगा रंग मेरे ड्रायबल से नहीं। दा और डीसी मेरे ड्रायबल के मूल अल्फा और रंग मान होंगे।
  • मेरे पास एक छवि थी और मैं उपयोगकर्ता इनपुट से अल्फा मानों के साथ कुछ रंग लागू करना चाहता हूं। मैंने पोर्टरडफ मोड्स का उपयोग करने की कोशिश की, मेरा मूल मायड्राउबल एक नौ पैच ड्रॉबल था और इसमें पारदर्शी पृष्ठभूमि और ट्रांजुलर कोनों जैसे मैसेजिंग बबल त्रिकोण थे। जब मैंने

    सार्वजनिक स्थिर अंतिम पोर्टरडफ का उपयोग किया।मोड एसआरसी [सा, एससी]

स्रोत रंग और स्रोत अल्फा, जो मैं ऊपर setColorFilter विधि desiredColor का रंग और अल्फा मूल्यों माना लागू होता है, मैं रंग मान सही यानी रंग और अल्फा सही ढंग से नया करने के लिए लागू किया गया था मिल गया उस छवि पर चित्रकारी लेकिन त्रिभुज पूरी तरह से धोया/हटा दिया गया था। तो मुझे ColorMatrixFilter और सेटअप मैट्रिक्स का उपयोग करना था और ड्रा करने योग्य करने के लिए अलग-अलग अल्फा मान सेट करना था।

संबंधित मुद्दे