我要做的是在现有图像上绘制一定程度不透明度的纯色和/或图案。我相信从我读过的内容中,这将涉及一个位图掩码。我看到的使用位图蒙版作为不透明蒙版的示例仅显示它们用于图像以某种方式裁剪它们,我想用它来绘画。这基本上就是我想要完成的事情:
使用DrawImage加载第一个图像并将其绘制到派生的Canvas类中。我正在努力完成你在第3张图片中看到的内容,第2张是我可能使用的面具的一个例子。两个关键点是第三个图像中的蓝色表面需要是任意颜色,并且它需要一些不透明度,以便您仍然可以看到底层图像上的阴影。这是一个简单的例子,其他一些对象具有更多的表面细节和更复杂的掩模。
答案 0 :(得分:2)
颜色矩阵在这里很有用:
private Image tooth = Image.FromFile(@"c:\...\tooth.png");
private Image maskBMP = Image.FromFile(@"c:\...\toothMask.png");
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
e.Graphics.DrawImage(tooth, Point.Empty);
using (Bitmap bmp = new Bitmap(maskBMP.Width, maskBMP.Height,
PixelFormat.Format32bppPArgb)) {
// Transfer the mask
using (Graphics g = Graphics.FromImage(bmp)) {
g.DrawImage(maskBMP, Point.Empty);
}
Color color = Color.SteelBlue;
ColorMatrix matrix = new ColorMatrix(
new float[][] {
new float[] { 0, 0, 0, 0, 0},
new float[] { 0, 0, 0, 0, 0},
new float[] { 0, 0, 0, 0, 0},
new float[] { 0, 0, 0, 0.5f, 0},
new float[] { color.R / 255.0f,
color.G / 255.0f,
color.B / 255.0f,
0, 1}
});
ImageAttributes imageAttr = new ImageAttributes();
imageAttr.SetColorMatrix(matrix);
e.Graphics.DrawImage(bmp,
new Rectangle(Point.Empty, bmp.Size),
0,
0,
bmp.Width,
bmp.Height,
GraphicsUnit.Pixel, imageAttr);
}
}
Matrix声明中的0.5f值是alpha值。