如何在Android中获取像素颜色

61

我正在使用Intent从图库中调用和显示一张图片,现在我使它能够通过以下方式将图片的坐标显示在TextView中:

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;    }     
    });
现在我需要做的是:获取用户选择的确切坐标的颜色(RGB 值),并将每个值分配给 #FF0000#00FF00#0000FF,但现在请帮助我根据我所拥有的内容获取像素颜色。祝好。
3个回答

134
你可以按照以下方式从视图中获取像素:
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);

Color函数返回每个通道中的值。因此,您只需要检查红色通道是否为255并且绿色和蓝色通道是否为0,然后将textView文本设置为"它是红色"。但请注意,说某物是红色并不仅仅意味着红色通道大于零。因为255-Green和255-Red是黄色。您还可以将像素与不同的颜色进行比较。例如:

if(pixel == Color.MAGENTA){
   textView.setText("It is Magenta");
}
希望能帮到你。

我无法让它正常工作。它返回了NullPointerException。 - KarenAnne
在哪个部分会返回NullPointerException? - Raz
我在这里得到一个错误:http://stackoverflow.com/questions/21347029/bitmapdrawable-is-throwing-an-error?noredirect=1#comment32184988_21347029 - Si8
2
你的答案有点错误。请查看这里以获取完整的信息: http://android-er.blogspot.ru/2012/10/get-touched-pixel-color-of-scaled.html - Alex Semeniuk
如何从位图中获取强调颜色 > - Prasad
显示剩余5条评论

7

您可以根据自己的需求进行修改。这段代码片段将帮助您获取像素颜色。

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;
}

3

对我来说,这更准确。关键在于使用View.getDrawingCache而不是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;   
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接