2009-11-24 13 views
18

एक ग्रेस्केल में रंग बदलने योग्य (अक्षम राज्य को इंगित करने के लिए) सही तरीका क्या होगा?Drawable => ग्रेस्केल

संपादित करें:
B/W => ग्रेस्केल

उत्तर

91

मैं जानता हूँ कि इस सवाल का कुछ समय पहले कहा गया था, लेकिन मैं एक सरल समाधान काम करता है कि यदि आप एक Drawable है और आप बस में है कि एक ही drawable प्रदर्शित करना चाहते हैं भर में आया था ग्रेस्केल। कैनवास या चित्रकार की आवश्यकता नहीं है ...

protected Drawable convertToGrayscale(Drawable drawable) 
{ 
    ColorMatrix matrix = new ColorMatrix(); 
    matrix.setSaturation(0); 

    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); 

    drawable.setColorFilter(filter); 

    return drawable; 
} 

आशा है कि इससे भी मदद मिलती है!

+0

वाह, इतना आसान, बहुत अच्छा! – tacone

+0

मैन, आप एक जादूगर हैं, धन्यवाद एक बुन! – Sipty

+1

अच्छी टिप! कुछ दिलचस्प बात यह है कि यदि आप ContextCompat.getDrawable (संदर्भ, R.drawable.myId) पास करके इस विधि को चलाते हैं; अगली बार आपको एक ही ड्रॉइंग प्राप्त करने की आवश्यकता है, रंग फ़िल्टर पहले ही सेट हो चुका है। मेरे भाग के लिए मुझे रंगीन रंग को वापस खींचने के लिए रंग फ़िल्टर को हटाने की आवश्यकता है :) – Tobliug

17

जाहिर है आप रंग-अंतरिक्ष परिवर्तनों के किसी भी प्रकार करने के लिए ColorMatrix वर्ग का उपयोग कर सकते हैं। इसमें setSaturation() विधि है जो आसानी से आपके लिए रंग-से-ग्रेस्केल परिवर्तन (शून्य संतृप्ति) बनाता है।

तो, आप उस फ़िल्टर का उपयोग छवि की एक नई प्रतिलिपि बनाने के लिए कर सकते हैं। मैं इस प्रयास नहीं किया है, लेकिन यह काम करना चाहिए:

Bitmap grayscaleBitmap = Bitmap.createBitmap(
    colorBitmap.getWidth(), colorBitmap.getHeight(), 
    Bitmap.Config.RGB_565); 

Canvas c = new Canvas(grayscaleBitmap); 
Paint p = new Paint(); 
ColorMatrix cm = new ColorMatrix(); 

cm.setSaturation(0); 
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(cm); 
p.setColorFilter(filter); 
c.drawBitmap(colorBitmap, 0, 0, p); 
1

आप विशेष रूप से बस छवियों के विकलांग संस्करणों के साथ प्रोग्राम के और न ऐसा करने के लिए इच्छुक हैं? आप एक एक्सएमएल ड्रायरेबल का संदर्भ दे सकते हैं, जैसे:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
 <item android:state_window_focused="false" android:state_enabled="true" 
     android:drawable="@drawable/btn_default_normal" /> 
 <item android:state_window_focused="false" android:state_enabled="false" 
     android:drawable="@drawable/btn_default_normal_disable" /> 
    <item android:state_pressed="true" 
     android:drawable="@drawable/btn_default_pressed" /> 
    <item android:state_focused="true" android:state_enabled="true" 
     android:drawable="@drawable/btn_default_selected" /> 
    <item android:state_enabled="true" 
     android:drawable="@drawable/btn_default_normal" /> 
    <item android:state_focused="true" 
     android:drawable="@drawable/btn_default_normal_disable_focused" /> 
    <item 
     android:drawable="@drawable/btn_default_normal_disable" /> 
</selector> 
+0

हाँ, मैं इसे प्रति-उदाहरण के आधार पर करना चाहता हूं। हालांकि स्निपेट के लिए धन्यवाद। – yanchenko

3

@intgr के उत्तर में कुछ कॉमेंट्स। अल्फा चैनल को संरक्षित करने के लिए
1. Bitmap.Config.ARGB_8888
2. एक छोटी सी अतिरिक्त कोड:

//remember, you are converting a .png image, as opposed to a Drawable defined in .xml 
Bitmap colorBitmap = ((BitmapDrawable)drawable).getBitmap();  
// the code by intgr 
Drawable grayscaleDrawable = new BitmapDrawable(grayscaleBitmap); 
+1

छोटे टाइपो: बिटमैप.कोनफिग.आरजीबी_8888 बिटमैप.कॉन्फिग.एआरबीबी_8888 होना चाहिए। धन्यवाद, तो धन्यवाद। – Minsky

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