如何获取画布像素

5

我有一个画布,在上面画线:

//see code upd

我需要制作一个吸管工具,它可以从我的画布中取色。我该如何制作?
代码更新:
private static class DrawView extends View 
{
        ...
        public DrawView(Context context) {
            super(context);
            setFocusable(true);

            mBitmap = Bitmap.createBitmap(640, 860, Bitmap.Config.ARGB_8888);
            mCanvas = new Canvas(mBitmap);
            mPath = new Path();
            mBitmapPaint = new Paint(Paint.DITHER_FLAG);

            this.setDrawingCacheEnabled(true);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawColor(0xFFAAAAAA);
            canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
            canvas.drawPath(mPath, mPaint);
        }
        private void touch_up()
        {
            if(!drBool) //is true when I click pipette button
            {
                ...
                mCanvas.drawPath(mPath, mPaint); // lines draw
                mPath.reset();
            }else{
                this.buildDrawingCache();
                cBitmap = this.getDrawingCache(true);
                if(cBitmap != null)
                {
                    int clr = cBitmap.getPixel((int)x, (int)y);
                    Log.v("pixel", Integer.toHexString(clr));
                    mPaint.setColor(clr);
                }else{
                    Log.v("pixel", "null");
                }
            }
            drBool = false;
        }
    }

我只看到“像素”-“ffaaaaaa”,或者如果我使用mCanvas.drawColor(Color.GRAY),则为“像素”-“ff888888”。
2个回答

14

画布只是一个容器,用于保存绘制调用以操作位图。因此,没有“从画布中取颜色”的概念。

相反,您应该检查视图的位图的像素,可以使用getDrawingCache获取。

在视图的构造函数中:

this.setDrawingCacheEnabled(true);

当您想要获取像素的颜色:

this.buildDrawingCache();
this.getDrawingCache(true).getPixel(x,y);

如果您需要多次调用它,那么这种方法非常低效。在这种情况下,您可能需要添加一个位图字段,并使用getDrawingCache()将其设置在ondraw()中。

private Bitmap bitmap;

...

onDraw()

  ...

  bitmap = this.getDrawingCache(true);

然后使用bitmap.getPixel(x,y);


这段代码只对drawColor起作用,但它无法看到drawPath创建的颜色。 - Leo
它必须能够工作!getPixel正是如此。它直接从位图(即存储位图的字节数组)获取x、y处的像素,并呈现在屏幕上。当drawPath方法渲染到位图时,最终绘制像素,因此在这个级别(getPixel)任何绘制调用之间没有区别。我怀疑x和y的计算可能是错误的。 - Simon

1
上面的答案返回了一个空位图。这是我的解决方案。
@Override
protected void onDraw(Canvas canvas) {
    ...
    bitmapUpdated = true;
}

然后获取位图

public Bitmap getBitmapImage() {
    if (bitmapUpdated) {
        this.buildDrawingCache();
        bitmapImage = Bitmap.createBitmap(this.getDrawingCache());
        this.destroyDrawingCache();
    }
    return bitmapImage;
}

这对我来说很好用,没有过多的开销。
也许更好的解决方案是重写invalidate()和onDraw()方法,以便使用与你的位图链接的画布。
Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.draw(c);
return b;

这个很好用!我试图从我画的位图中获取颜色,它确实返回了正确的值,然而,在应用滤镜之后,并没有(好吧,它仍然返回原始颜色)。你的解决方案完成了任务。 - Danny E.K. van der Kolk

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