Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you get the RGB values from a Bitmap on an Android device?

I want to get RGB values of a Bitmap on Android but I can't do this so far. My aim is to obtain RGB values for each pixel of a Bitmap. Is there any specific function for Android or anything else?

Also I wonder that do I need colorMatrix() function?

It is very important for my project.

like image 595
barzos Avatar asked Apr 14 '11 20:04

barzos


People also ask

How do you extract RGB values?

Click on the color selector icon (the eyedropper), and then click on the color of in- terest to select it, then click on 'edit color'. 3. The RGB values for that color will appear in a dialogue box.

What is RGB in Android?

An RGB color space is an additive color space using the RGB color model (a color is therefore represented by a tuple of 3 numbers). A specific RGB color space is defined by the following properties: Three chromaticities of the red, green and blue primaries, which define the gamut of the color space.

How can I check the pixels of an image in Android?

getY())); ImageView imageView = ((ImageView)v); Bitmap bitmap = ((BitmapDrawable)imageView. getDrawable()). getBitmap(); int pixel = bitmap. getPixel(x,y); int redValue = Color.


2 Answers

Bitmap#getPixel(x, y) returns an int with the colour values and alpha value embedded into it.

int colour = bitmap.getPixel(x, y);  int red = Color.red(colour); int green = Color.green(colour); int blue = Color.blue(colour); int alpha = Color.alpha(colour); 
like image 114
Cobbles Avatar answered Sep 26 '22 22:09

Cobbles


This may be slightly late, but to clear up the confusion with the use of &0xff:

In Java ints are 32 bits, so the (A)RGB values for each pixel are packed in 4 bytes. In other words, a pixel with the values R(123), G(93), B(49) = FF7B 5D31 in the ARGB_8888 model. Where Alpha = FF, R = 7B, G = 5D, B = 31. But this is stored as an int as -8692431.

So, to extract the Green value from -8692431, we need to shift the 5D by 8 bits to the right, as you know. This gives 00FF 7B5D. So, if we were just to take that value we would be left with 16743261 as our Green value. Therefore, we bitwise-and that value with the mask of 0xFF (which is equivalent to 0000 00FF) and will result in 00FF 7B5D being 'masked' to 0000 005D. So we have extracted our Green value of 5D (or 93 decimal).

We can use the same mask of 0xFF for each extraction because the values have all been shifted to expose the desired two bytes as the least significant. Hence the previously suggested code of:

int p = pixel[index];  int R = (p >> 16) & 0xff; int G = (p >> 8) & 0xff; int B = p & 0xff; 

If it makes it clearer, you can perform the equivalent operation of:

int R = (p & 0xff0000) >> 16; int G = (p & 0x00ff00) >> 8; int B = (p & 0x0000ff) >> 0; 

For brevity, the extra 0s can be dropped, and it can be written as

int R = (p & 0xff0000) >> 16; int G = (p & 0xff00) >> 8; int B = p & 0xff; 

Note however, that alternative colour models may be used, such as RGB_555 which stores each pixel as just 2 bytes, with varying precision for the RGB channels. So you should check the model that your bitmap is using before you perform the extraction, because the colours may be stored differently.

like image 45
QuackSaysHe Avatar answered Sep 23 '22 22:09

QuackSaysHe