How to Get Pixel Color in Android

AndroidPixel

Android Problem Overview


I'm using Intent to call and show an image from Gallery, and now I made it enable to get me the coordinates of the image in a TextView using these:

final TextView textView = (TextView)findViewById(R.id.textView); 
final TextView textViewCol = (TextView)findViewById(R.id.textViewColor);
targetImage.setOnTouchListener(new ImageView.OnTouchListener(){  	
	@Override 	
	public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub 		 
		int x=0;
		int y=0;
		textView.setText("Touch coordinates : " +  		
		String.valueOf(event.getX()) + "x" + String.valueOf(event.getY()));
		ImageView imageView = ((ImageView)v);
		Bitmap bitmap = ((BitmapDrawable)imageView.getDrawable()).getBitmap();
		int pixel = bitmap.getPixel(x,y);
		int redValue = Color.red(pixel);
		int blueValue = Color.blue(pixel);
		int greenValue = Color.green(pixel);
		if(pixel == Color.RED){
			   textViewCol.setText("It is RED");
			}
			
		/*if(redValue == 255){
			if(blueValue == 0)
				if(greenValue==0)
			   textViewCol.setText("It is Red");
			}*/
		return true; 	}	  
	});

Now what I need to do is; to get the color (RGB value) of the exact coordinates the user selects and later on assign each to #FF0000, #00FF00 and #0000FF but for now, please help to get the Pixel color based on what I have.

Cheers.

Android Solutions


Solution 1 - Android

You can get the pixel from the view like this:

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

Now you can get each channel with:

int redValue = Color.red(pixel);
int blueValue = Color.blue(pixel);
int greenValue = Color.green(pixel);

The Color functions return the value in each channel. So all you have to do is check if Red is 255 and green and blue are 0, than set the textView text to "it is red". Just pay attention that saying that something is red is not simply that the red channel is the greater than zero. 'Cos 255-Green and 255-Red is yellow, of course. You can also just compare the pixel to different color. for example:

if(pixel == Color.MAGENTA){
   textView.setText("It is Magenta");
}

Hope it helps.

Solution 2 - Android

You can modify this for your requirement. This snippet will help you get the pixel color.

public static int getDominantColor(Bitmap bitmap) {
	Bitmap newBitmap = Bitmap.createScaledBitmap(bitmap, 1, 1, true);
	final int color = newBitmap.getPixel(0, 0);
	newBitmap.recycle();
	return color;
}

Solution 3 - Android

This works more accurately for me. The key here is to use the View.getDrawingCache instead of DrawableBitmap.

palleteView.setOnTouchListener(new View.OnTouchListener() {

	@Override
	public boolean onTouch(View v, MotionEvent ev) {
		// TODO Auto-generated method stub
		ImageView img = (ImageView) v;

		final int evX = (int) ev.getX();
		final int evY = (int) ev.getY();

		img.setDrawingCacheEnabled(true);
		Bitmap imgbmp = Bitmap.createBitmap(img.getDrawingCache());
		img.setDrawingCacheEnabled(false);

		try {
			int pxl = imgbmp.getPixel(evX, evY);

			pickedColorView.setBackgroundColor(pxl);
		   
		}catch (Exception ignore){
		}
		imgbmp.recycle();
		
		return true;   
	}
});

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSeanView Question on Stackoverflow
Solution 1 - AndroidRazView Answer on Stackoverflow
Solution 2 - AndroidonexfView Answer on Stackoverflow
Solution 3 - Androidkc ochibiliView Answer on Stackoverflow