用Paint给位图上色?

5
我将翻译如下内容:

我正在尝试创建一个函数,用于给位图着色,

这个函数可以正常工作...

 imgPaint = new Paint();

    imgPaint.setColorFilter(new LightingColorFilter(color,0));

//when image is being drawn
canvas.drawBitmap(img,matrix,imgPaint);

然而,当位图需要不断绘制(每一帧)时,我开始看到屏幕滞后。因为在设置颜色过滤器之前,这种情况并没有发生,我认为它是每次需要绘制画布时都会应用过滤器的结果。
有没有一种方法可以将油漆一次性地应用于位图并永久更改它呢?
任何帮助都会感激 :)

1
确保您只创建一次绘画和颜色过滤器,并将它们存储在变量中以便重复使用,而不是在每个帧中重新创建它们。 - Will Kru
1个回答

5
创建第二个位图,并使用颜色过滤器将第一个位图绘制到其中。然后使用第二个位图进行高容量渲染。
编辑:根据请求,以下是可实现此功能的代码:
public Bitmap makeTintedBitmap(Bitmap src, int color) {
    Bitmap result = Bitmap.createBitmap(src.getWidth(), src.getHeight(), src.getConfig());
    Canvas c = new Canvas(result);
    Paint paint = new Paint();
    paint.setColorFilter(new LightingColorFilter(color,0));
    c.drawBitmap(src, 0, 0, paint);
    return result;
}

您可以调用此方法一次,将位图转换为带色调的位图,并将结果保存在实例变量中。然后,在绘制到canvas的方法中直接使用带色调的位图(而不使用颜色过滤器)。 (最好预先分配您将在主绘制方法中使用的Paint对象,并将其也保存在实例变量中,而不是在每个绘制中分配新的Paint对象。)


1
谢谢您的快速回复,Ted。我该如何使用Paint将第一个位图绘制到第二个位图上? - seveibar
创建一个新的位图(Bitmap bmNew = Bitmap.createBitmap(bmOld.getWidth(),bmOld.getHeight(),bmOld.getConfig());)。然后创建一个新的画布(Canvas c = new Canvas(bmNew);)。使用新画布使用带有颜色过滤器的Paint绘制bmOld到bmNew中。这样可以得到在不带过滤器的Paint下重复使用的位图bmNew。 - Ted Hopp
你能提供一些代码,使用具有颜色过滤器的Paint将“bmOld”绘制到“bmNew”中吗? - Mark Cramer

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