2

我正在尝试做的是在现有图像上绘制具有一定程度不透明度的纯色和/或图案。我相信从我读过的内容来看,这将涉及一个位图掩码。我看到的使用位图蒙版作为不透明蒙版的示例仅显示它们用于以某种方式裁剪图像,并且我想将其用于绘画。这基本上是我想要完成的事情:

1.图像,2.蒙版,3.结果

第一个图像正在使用 DrawImage 加载并绘制到派生的 Canvas 类上。我正在尝试完成您在第三张图片中看到的内容,第二张是我可能使用的蒙版示例。两个关键点是第三张图像中的蓝色表面需要是任意颜色,并且它需要一些不透明度,以便您仍然可以看到底层图像上的阴影。这是一个简单的例子,其他一些对象有更多的表面细节和更复杂的蒙版。

4

1 回答 1

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 值。

在此处输入图像描述

于 2013-09-23T19:23:27.303 回答