使用Android Paint检测背景图像颜色

11

当我开始绘画时,它着色整个背景,但实际上它应该只涂白色斑点。以下是应用程序截图。使用安卓绘画工具,我想要在背景Drawable[Panda]上仅绘制白色斑点,跳过其他颜色。

onDraw()函数如下:

protected void onDraw(Canvas canvas) {

    canvas.drawPath(path, paint);
    canvas.drawPath(circlePath, circlePaint);

    for (Pair<Path,Integer> path_clr : path_color_list ){
        paint.setColor(path_clr.second);
        canvas.drawPath( path_clr.first, paint);
    }

    for (Pair<Path,Integer> path_clr : circular_path_color_list ){
        circlePaint.setColor(path_clr.second);
        canvas.drawPath( path_clr.first, paint);
    }
}

并且 onTouchEvent 函数是:

public boolean onTouchEvent(MotionEvent event) {

    float pointX = event.getX();
    float pointY = event.getY();
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        circlePath.reset();
        path.moveTo(pointX, pointY);

        return true;
    case MotionEvent.ACTION_MOVE:
        path.lineTo(pointX, pointY);
        circlePath.reset();
        circlePath.addCircle(pointX, pointY, 10, Path.Direction.CW);

        break;

    case MotionEvent.ACTION_UP:
        circlePath.reset();

        break;
    default:
        return false;
    }

    postInvalidate();
    return true;
}

颜色活动

1个回答

7

您所描述的事情称为遮罩。您需要一个遮罩(白色区域)和一个带有遮罩的图像(您的笔画)。在绘制时,您必须使用遮罩将您的笔画裁剪成遮罩的形状。可以使用PorterDuff模式来完成此操作。请参见伪代码:

Bitmap panda;
Bitmap whiteAreas;
Bitmap strokes;
Canvas strokesCanvas;
Paint paint;

private void init() {
    strokesCanvas = new Canvas(strokes);
    paint = new Paint();
}

private void addStroke(Path stroke){
    paint.setXfermode(null);
    strokesCanvas.drawPath(stroke,paint);
    invalidate();
}

@Override
public void draw(Canvas canvas) {
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    strokesCanvas.drawBitmap(whiteAreas,0,0,paint);
    paint.setXfermode(null);
    canvas.drawBitmap(panda,0,0,paint);
    canvas.drawBitmap(strokes,0,0,paint);
}

请查看以下链接获取更多信息:http://ssp.impulsetrain.com/porterduff.html
编辑:下面是一个演示图片,蓝色区域应该是透明的。掩模和描边之间的乘法就是所谓的遮罩。

enter image description here


抱歉,我对位图遮罩没有任何了解。Bitmap whiteAreas 应该初始化为什么值?Bitmap strokes 也是同样的问题。 - Aown Raza
whiteAreas就像它的名字一样 - 一个与熊猫图像一样大的位图,具有透明背景,并绘制了熊猫的腹部和面部。 strokes位图用于保存用户所做的绘画。 我已经为您准备好了一张图片。 - Zielony
抱歉,我还是不明白 :( 我的意思是,我该如何从“view”类创建掩码和笔画位图?我们正在绘制的背景是从“view”扩展的类。 - Aown Raza
1
口罩是一个独立的 PNG 文件,由艺术家绘制可上色区域。笔画位图只是视图分配以容纳笔画的位图。 - Zielony

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