Aswathy
Aswathy

Reputation: 347

Changing the pixel color in 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)

Upvotes: 2

Views: 6670

Answers (3)

Jagadesh Seeram
Jagadesh Seeram

Reputation: 2664

Check this to create the immutable bitmap...

testButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Config config = null;
            int width = bitmap.getWidth();
            int height = bitmap.getHeight();
            if (bitmap.getConfig() == null) {
                config = Config.ARGB_8888;
            } else {
                config = bitmap.getConfig();
            }
            int pixel;
            // Here you ll get the immutable Bitmap
            Bitmap copyBitmap = bitmap.copy(config, true);
            // scan through all pixels
            for (int x = 0; x < width; ++x) {
                for (int y = 0; y < height; ++y) {
                    // get pixel color
                    pixel = bitmap.getPixel(x, y);
                    if (x == 400 && y == 200) {
                        copyBitmap.setPixel(x, y,
                                Color.argb(0xFF, Color.red(pixel), 0, 0));
                    } else {
                        copyBitmap.setPixel(x, y, pixel);
                    }
                }
            }
            imageView.setImageBitmap(copyBitmap);
        }
});

Upvotes: 0

Gopal Gopi
Gopal Gopi

Reputation: 11131

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

Upvotes: 9

Pedro Loureiro
Pedro Loureiro

Reputation: 11514

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.

Upvotes: 1

Related Questions