2011-04-18 16 views
29

मैं एक एंड्रॉइड एप्लिकेशन विकसित कर रहा हूं जिसमें मैंने छविदृश्य में एक छवि सेट की है। अब प्रोग्रामैटिक मैं बिटमैप छवि रंग बदलना चाहता हूं। मान लीजिए कि मेरी छवि में शुरुआत में लाल रंग है और अब मुझे इसे नारंगी रंग में बदलने की जरूरत है। मैं उसे कैसे कर सकता हूँ? कृपया मदद करे।एंड्रॉइड में बिटमैप छवि रंग कैसे बदलें?

मेरा कोड यहां है। मैं अस्पष्टता को बदलने में कामयाब रहा लेकिन मुझे नहीं पता कि रंग कैसे बदला जाए।

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     ImageView iv = (ImageView) findViewById(R.id.img); 
     Drawable d = getResources().getDrawable(R.drawable.pic1); 
     Bitmap mNewBitmap = ((BitmapDrawable)d).getBitmap(); 
     Bitmap nNewBitmap = adjustOpacity(mNewBitmap); 
     iv.setImageBitmap(nNewBitmap); 
    } 

    private Bitmap adjustOpacity(Bitmap bitmap) { 
     int width = bitmap.getWidth(); 
     int height = bitmap.getHeight(); 
     Bitmap dest = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
     int[] pixels = new int[width * height]; 
     bitmap.getPixels(pixels, 0, width, 0, 0, width, height); 
     dest.setPixels(pixels, 0, width, 0, 0, width, height); 
     return dest; 
    } 
+0

हाय, मैं एक ही समस्या है, लेकिन मैं किसी भी विचार नहीं मिल रहा है छवि रंग बदलने के बारे में। धन्यवाद, एंड्रॉइडवोग –

उत्तर

36

मुझे समाधान मिला।

Bitmap sourceBitmap = BitmapFactory.decodeFile(imgPath); 
    float[] colorTransform = { 
      0, 1f, 0, 0, 0, 
      0, 0, 0f, 0, 0, 
      0, 0, 0, 0f, 0, 
      0, 0, 0, 1f, 0}; 

    ColorMatrix colorMatrix = new ColorMatrix(); 
    colorMatrix.setSaturation(0f); //Remove Colour 
    colorMatrix.set(colorTransform); //Apply the Red 

    ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix); 
    Paint paint = new Paint(); 
    paint.setColorFilter(colorFilter); 

    Display display = getWindowManager().getDefaultDisplay(); 

    Bitmap resultBitmap = Bitmap.createBitmap(sourceBitmap, 0, (int)(display.getHeight() * 0.15), display.getWidth(), (int)(display.getHeight() * 0.75));    

    image.setImageBitmap(resultBitmap); 

    Canvas canvas = new Canvas(resultBitmap); 
    canvas.drawBitmap(resultBitmap, 0, 0, paint); 
+1

धन्यवाद दोस्त। स्वीकार किए जाते हैं। –

+0

सेट सेट किया गया है जब इसे किसी .set कॉल के बाद किया जाता है? – jjxtra

28
private void changeColor(){ 
    ImageView image = (ImageView) findViewById(R.id.imageView1); 
    Bitmap sourceBitmap = BitmapFactory.decodeResource(getResources(), 
      R.drawable.ic_launcher); 
    changeBitmapColor(sourceBitmap, image, Color.BLUE); 

} 

private void changeBitmapColor(Bitmap sourceBitmap, ImageView image, int color) { 

    Bitmap resultBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, 
      sourceBitmap.getWidth() - 1, sourceBitmap.getHeight() - 1); 
    Paint p = new Paint(); 
    ColorFilter filter = new LightingColorFilter(color, 1); 
    p.setColorFilter(filter); 
    image.setImageBitmap(resultBitmap); 

    Canvas canvas = new Canvas(resultBitmap); 
    canvas.drawBitmap(resultBitmap, 0, 0, p); 
} 
+0

मुझे लगता है कि यह उपयोगकर्ता 744881 के सुझाव से तेज़ होना चाहिए यदि आप केवल रंग बदलना चाहते हैं लेकिन मुझे पूरा यकीन नहीं है .. –

+0

1 मूल्य को प्रकाशकॉलरफ़िल्टर (रंग, 1) में दूसरे पैरामीटर के रूप में क्यों उपयोग किया जाता है? Stackoverflow.com/a/7049965/1245231 के अनुसार यह बहुत समझ में नहीं आता है। दोनों पैरामीटर int में एन्कोड किए गए एंड्रॉइड कलर वैल्यू हैं। मान 1 इसलिए # 00000001 रंग के बराबर है जो सभी पिक्सेल में जोड़ा जाता है। यह केवल सभी पिक्सल के लिए नीले रंग का रंग जोड़ता है जिसका इरादा नहीं था। 1 के बजाय यह केवल 0 का उपयोग करने के लिए और अधिक समझ में आता है: LightingColorFilter (रंग, 0)। अगर मैं इसे अच्छी तरह समझता हूं तो यह उत्तर केवल सफेद स्रोत छवियों के लिए सही ढंग से काम करता है। लेकिन काले रंग की केवल स्रोत छवियों के लिए बिल्कुल नहीं। – petrsyn

+0

यह पूरी तरह से प्रासंगिक नहीं है लेकिन ओपनगल में रंग 0 की अस्पष्टता को संरक्षित करने में कुछ समस्याएं हैं। इसलिए इसे 1 पर सेट करना अच्छा अभ्यास है। अगर यह बिल्कुल दिखाई दे, तो यह मुश्किल से होगा। –

39

मैं जोसिप के जवाब की कोशिश की लेकिन चाहे ऑफसेट पैरामीटर 1 या 0 गया था की परवाह किए बिना मेरे लिए काम नहीं होता है, - तैयार बिटमैप सिर्फ मूल रंग में दिखाई दिया।

हालांकि, इस काम किया:

// You have to copy the bitmap as any bitmaps loaded as drawables are immutable 
Bitmap bm = ImageLoader.getInstance().loadImageSync("drawable://" + drawableId, o) 
      .copy(Bitmap.Config.ARGB_8888, true); 

Paint paint = new Paint(); 
ColorFilter filter = new PorterDuffColorFilter(ContextCompat.getColor(this, R.color.COLOR_1_DARK), PorterDuff.Mode.SRC_IN); 
paint.setColorFilter(filter); 

Canvas canvas = new Canvas(bm); 
canvas.drawBitmap(bm, 0, 0, paint); 

अद्यतन 1

जबकि अच्छी तरह से ऊपर काम करता है और मामलों का एक बहुत में उपयोगी है, अगर आप सिर्फ एक का मुख्य रंग बदलना चाहते हैं imageView drawable, जो सेशन किया था, तो आप सिर्फ उपयोग कर सकते हैं:

imgView.setColorFilter(ContextCompat.getColor(this, R.color.COLOR_1_DARK)); 

यदि आप ne और अधिक लचीलापन एड या इस वांछित प्रभाव नहीं दे करता है, वहाँ एक अधिभार है कि आप PorterDuff Mode बदलने के लिए जब तक आप आप क्या कर रहे हैं पाने के लिए अनुमति देता है के बाद:

imgView.setColorFilter(ContextCompat.getColor(this, R.color.COLOR_1_DARK), PorterDuff.Mode.SRC_ATOP); 

अद्यतन 2

एक और अच्छा उपयोग अगर मैं हाल ही में Google मानचित्र v2 मार्कर आइकन की उपस्थिति को अनुकूलित कर रहा हूं। मार्कर पर छोटे/बड़े आइकन (उदाहरण के लिए) अनुमति देने के लिए 2 ग्राफिक्स का उपयोग करने के लिए, लेकिन गतिशील रूप से उनके रंग को बदलकर उन 2 ग्राफिक्स पर रंगों की एक श्रृंखला भी। मेरे मामले में मैं एक ClusterRenderer अंदर इस कर रहा था के रूप में मार्कर भी क्लस्टर रहे थे, लेकिन यह एक नियमित रूप से मैप मार्कर के साथ उसी तरह इस्तेमाल किया जा सकता:

@Override 
protected void onBeforeClusterItemRendered(MyClusterItem item, MarkerOptions markerOptions) { 
    try { 
     int markerColor = item.getColor(); 

     Bitmap icon; 

     if (item.isFeatured()) { 
      // We must copy the bitmap or we get an exception "Immutable bitmap passed to Canvas constructor" 
      icon = BitmapFactory.decodeResource(context.getResources(), 
        R.drawable.icon_marker_large).copy(Bitmap.Config.ARGB_8888, true); 
     } else { 
      // We must copy the bitmap or we get an exception "Immutable bitmap passed to Canvas constructor" 
      icon = BitmapFactory.decodeResource(context.getResources(), 
        R.drawable.icon_marker_small).copy(Bitmap.Config.ARGB_8888, true); 
     } 

     Paint paint = new Paint(); 
     ColorFilter filter = new PorterDuffColorFilter(ContextCompat.getColor(context, markerColor), PorterDuff.Mode.SRC_IN); 
     paint.setColorFilter(filter); 

     Canvas canvas = new Canvas(icon); 
     canvas.drawBitmap(icon, 0, 0, paint); 

     markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon)); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 
+0

यह मेरे लिए काम करता था जब मैंने अपनी छवि को उज्ज्वल रंगों में रंग दिया, जो वास्तव में मुझे आवश्यक था। +1 – Android

+0

मैं अपने टेक्स्ट व्यू की अनियमित आकार पृष्ठभूमि छवि को बदलने के लिए इसका उपयोग करता हूं, यह ठीक काम करता है। – cuble

4

सबसे आसान तरीका बदलने के लिए अर्थात्, सबसे आसान और तेज़ तरीका सिर्फ एक फिल्टर द्वारा drawColor() पर कैनवास विधि, सही drawBitmap के बाद() का उपयोग कर आवेदन कर रहा है बिटमैप्स रंग इस विधि के साथ है:

bitmap.eraseColor(ContextCompat.getColor(this, R.color.your_color)); 

आप रंग उपयोग के साथ imageView ओवरले करना चाहते हैं:

+०१२३५१६४१०
imageView.setColorFilter(ContextCompat.getColor(this, R.color.your_color)); 
4

यह बेहतर प्रतिलिपि द्वारा अस्थायी बिटमैप प्राप्त है आकार बदलने के बिना,: के रूप में मैं COLORMATRIX का उपयोग कर छवि की चमक को बदलने में कामयाब रहे

public static Bitmap changeBitmapColor(Bitmap sourceBitmap, int color) 
{ 
    Bitmap resultBitmap = sourceBitmap.copy(sourceBitmap.getConfig(),true); 
    Paint paint = new Paint(); 
    ColorFilter filter = new LightingColorFilter(color, 1); 
    paint.setColorFilter(filter); 
    Canvas canvas = new Canvas(resultBitmap); 
    canvas.drawBitmap(resultBitmap, 0, 0, paint); 
    return resultBitmap; 
} 
संबंधित मुद्दे