Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Changing the pixel color in android

Tags:

android

testButton.setOnClickListener(new Button.OnClickListener(){

        @Override
        public void onClick(View v) 
        {
            Bitmap mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);for (int i = 0; i < mutableBitmap.getWidth(); i++) 
                {
                    for (int j = 0; j < mutableBitmap.getHeight(); j++) 
                    {
                        int pixel = mutableBitmap.getPixel(i, j);
                        // get red color value
                        int red = Color.red(pixel);
                        int color = Color.argb(0xFF, red, 0, 0);
                        mutableBitmap.setPixel(i, j, color);
                        imageView.setImageBitmap(mutableBitmap);
                    }
                }
        }


        });

I am trying to change the pixel color with only red value. Therefore i get the red value from a given pixel and then tried to replace the same pixel with only that red value. The program runs successfully but when i click the button it crashes out. Can anyone tell me what i am doing wrong

LOGCAT error

12-03 15:16:57.228: E/AndroidRuntime(5103): FATAL EXCEPTION: main
12-03 15:16:57.228: E/AndroidRuntime(5103): java.lang.IllegalStateException
12-03 15:16:57.228: E/AndroidRuntime(5103): at android.graphics.Bitmap.setPixel(Bitmap.java:1002)
12-03 15:16:57.228: E/AndroidRuntime(5103): at com.example.imaging.AndroidCamera$7.onClick(AndroidCamera.java:216)
12-03 15:16:57.228: E/AndroidRuntime(5103): at android.view.View.performClick(View.java:3511)
12-03 15:16:57.228: E/AndroidRuntime(5103): at android.view.View$PerformClick.run(View.java:14109)
12-03 15:16:57.228: E/AndroidRuntime(5103): at android.os.Handler.handleCallback(Handler.java:605)
12-03 15:16:57.228: E/AndroidRuntime(5103): at android.os.Handler.dispatchMessage(Handler.java:92)
12-03 15:16:57.228: E/AndroidRuntime(5103): at android.os.Looper.loop(Looper.java:137)
12-03 15:16:57.228: E/AndroidRuntime(5103): at android.app.ActivityThread.main(ActivityThread.java:4424)
12-03 15:16:57.228: E/AndroidRuntime(5103): at java.lang.reflect.Method.invokeNative(Native Method
12-03 15:16:57.228: E/AndroidRuntime(5103): at java.lang.reflect.Method.invoke(Method.java:511)
12-03 15:16:57.228: E/AndroidRuntime(5103): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-03 15:16:57.228: E/AndroidRuntime(5103): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-03 15:16:57.228: E/AndroidRuntime(5103): at dalvik.system.NativeStart.main(Native Method)
like image 552
Aswathy Avatar asked Jan 25 '26 06:01

Aswathy


2 Answers

You are trying to modify pixels of a Immutable bitmap.You can not modify the pixels of a immutable Bitmap. if you try it will throw IllegalStateException.

use below method to get Mutable Bitmap from Resources

public static Bitmap getMutableBitmap(Resources resources,int resId) {
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inMutable = true;
    return BitmapFactory.decodeResource(resources, resId, options);
}

or use

    Bitmap mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);

to get mutable Bitmap from immutable bitmap

like image 91
Gopal Gopi Avatar answered Jan 27 '26 23:01

Gopal Gopi


Reading the documentation, you see that this method might throw an IllegalStateException if you try to set the Pixel in an immutable bitmap.

public void setPixel (int x, int y, int color)

Added in API level 1
Write the specified Color into the bitmap (assuming it is mutable) at the x,y coordinate. The color must be a non-premultiplied ARGB value.

Parameters
x   The x coordinate of the pixel to replace (0...width-1)
y   The y coordinate of the pixel to replace (0...height-1)
color   The ARGB color to write into the bitmap
Throws
IllegalStateException   if the bitmap is not mutable
IllegalArgumentException    if x, y are outside of the bitmap's bounds.

If you are using one of those createBitmap methods, most of them return immutable bitmaps, so either use a different creator method, or get a mutable copy of the bitmap you get.

like image 25
Pedro Loureiro Avatar answered Jan 27 '26 23:01

Pedro Loureiro