这似乎应该很简单,但我似乎找不到任何方法来做到这一点。我有一个自定义 WinForms 控件,它有一个重写的绘制方法,可以进行一些自定义绘图。
我在内存中有一个位图,我想做的就是用 HashBrush 绘制整个东西,但保留 alpha 通道,这样就不会绘制位图的透明部分。
内存中的位图不是一个简单的形状,因此将其定义为一组路径或任何东西是不可行的。
编辑:为了响应显示代码,绘画例程中有很多代码,所以我只包括一个相关的片段,这是有问题的方法。从主绘制覆盖调用此方法。它接受一个图像列表,这些图像是黑色透明蒙版,并将它们组合成一个,然后它使用 ColorMatrix 来更改它创建的组合图像的颜色,使其可以覆盖在背景之上。我想要完成的只是能够在其上绘制井号。
private void PaintSurface(PaintEventArgs e, Image imgParent, List<Image> surfImgs, Rectangle destRect, ToothSurfaceMaterial material)
{
using (Bitmap bmp = new Bitmap(imgParent.Width, imgParent.Height,
System.Drawing.Imaging.PixelFormat.Format32bppPArgb))
{
using (Graphics g = Graphics.FromImage(bmp))
{
foreach (Image img in surfImgs)
{
g.DrawImage(img, System.Drawing.Point.Empty);
}
}
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.7f, 0},
new float[] { material.R / 255.0f,
material.G / 255.0f,
material.B / 255.0f,
0, 1}
});
ImageAttributes imageAttr = new ImageAttributes();
imageAttr.SetColorMatrix(matrix);
Rectangle r = GetSizedRect(imgParent, destRect);
e.Graphics.DrawImage(bmp,
r,
0,
0,
bmp.Width,
bmp.Height,
GraphicsUnit.Pixel, imageAttr);
}
}