【发布时间】:2022-01-23 17:16:34
【问题描述】:
我有一张灰色的图像。我想用一种颜色来绘制它,但对画布不透明。通过使用滤色器,我可以通过替换颜色在画布上绘制它。如果我调整 alpha 值,它会改变图像的不透明度(部分灰色/红色)。以下代码 sn-p 显示了如何在画布上绘制灰色图像为红色。但是如何将红色图像绘制为对画布透明?
static void drawBrushDetail(Canvas canvas, double cx, double cy, double brushSize, double imageAngleRad) {
canvas.translate(cx + brushSize / 2, cy + brushSize / 2);
ui.Image bt = imgBrushTip; //this is a gray image
Color selectedColor = getDrawColor(cx,cy);
final _paint = Paint();
var alphaVal=255;
//if I change alphaVal to 100, the final draw looks more gray instead of red with 100 Alpha
_paint.colorFilter = ColorFilter.mode(selectedColor.withAlpha(alphaVal), BlendMode.srcATop);
if (imageAngleRad != 0.0) canvas.rotate(imageAngleRad);
canvas.translate(-brushSize / 2, -brushSize / 2);
// draw image with specified brushSize
canvas.drawImageRect(bx, Rect.fromLTRB(0, 0, bt.width, bt.height),
Rect.fromLTRB(0, 0, brushSize, brushSize), _paint);
//traslate back, don't want to use save and restore layer since it's expensive
canvas.translate(brushSize / 2, brushSize / 2);
if (imageAngleRad != 0.0) canvas.rotate(-imageAngleRad);
canvas.translate(-cx - brushSize / 2, -cy - brushSize / 2);
}
见下图。上面的代码将用纯红色绘制图像。 (红色箭头指向的图像)。但我希望结果是红色和透明的图像。由于在Flutter中没有设置canvas alpha的API,不知道是否可以。
【问题讨论】:
-
@pskink 感谢您的评论。我添加了图片以澄清问题。
-
final p0 = Paint()..colorFilter = ColorFilter.mode(Colors.white.withOpacity(0.75), BlendMode.dstIn); final p1 = Paint()..colorFilter = ColorFilter.mode(Colors.orange, BlendMode.modulate); canvas ..saveLayer(Offset.zero & imageSize, p0) ..drawImage(image, Offset.zero, p1) ..restore();- 除了modulate,你也可以使用srcATop或其他模式 -
你也可以使用:
final matrix = Matrix4.translationValues(100.0, 250.0, 0).storage; final p2 = Paint() ..colorFilter = ColorFilter.mode(Colors.orange.withOpacity(0.75), BlendMode.srcIn) ..shader = ImageShader(image!, TileMode.decal, TileMode.decal, matrix); canvas.drawPaint(p2); -
@pskink,这超出了我的理解。我会玩弄它,看看我能不能弄明白。
-
什么是无法理解的?请注意,第一个解决方案可能很昂贵(对于更大的图像),因为使用了
Canvas.saveLayer
标签: flutter image canvas filter