C#图形在区域上绘制透明矩形

时间:2011-09-09 13:30:46

标签: c# graphics

我有两个图像叠在彼此的顶部,并希望能够清除顶部图像的一部分。通常,如果我想清除图像的一部分,我只需要通过

将其绘制为背景颜色
g.FillRectangle(Brushes.White,x,y,width,height);

但如果我在顶部图像上执行此操作,则底部图像的区域会被白色矩形覆盖。我试着做了

g.FillRectangle(Brushes.Transparent,x,y,width,height);

但这似乎并没有清除所有以前内容的区域。有什么办法可以让那个区域的像素透明吗?

4 个答案:

答案 0 :(得分:3)

//using System.Drawing.Drawing2D;

g.FillRectangle(Brushes.White,x,y,width,height);
g.CompositingMode = CompositingMode.SourceCopy;    
g.FillRectangle(Brushes.Transparent,x,y,width,height);

答案 1 :(得分:2)

这是不可能的。

GDI +和Graphics类不支持分层绘图;一旦你覆盖了上一张图片,那些像素就会消失

您应该通过调用带有两个矩形的DrawImage重载来重新绘制您想要显示的上一个图像部分。

如果下方图像包含透明部分,则应首先通过调用FillRectangle将该区域清除为白色(或原始背景),以便正确覆盖透明度。

答案 2 :(得分:2)

另一种选择是不直接绘制图像。使用:

System.Windows.Forms.PictureBox

和它的属性

Region

更改图像的可见性/透明度。区域不必是矩形。它可以从任何一组行定义。

PS:Brushes.Transparent并不意味着透明,而是父容器的BackColor。

答案 3 :(得分:0)

float[][] ptsArray ={
            new float[] {1, 0, 0, 0, 0},
            new float[] {0, 1, 0, 0, 0},
            new float[] {0, 0, 1, 0, 0},
            new float[] {0, 0, 0, 0.5f, 0},
            new float[] {0, 0, 0, 0, 1}};
            ColorMatrix clrMatrix = new ColorMatrix(ptsArray);
            ImageAttributes imgAttributes = new ImageAttributes();
            imgAttributes.SetColorMatrix(clrMatrix,
            ColorMatrixFlag.Default,
            ColorAdjustType.Bitmap);
            _ImageThumb.Height, imgAttributes);
            e.Graphics.DrawImage(_ImageThumb,new Rectangle(0, 0, _ImageThumb.Width,_ImageThumb.Height),0, 0, _ImageThumb.Width, _ImageThumb.Height,GraphicsUnit.Pixel, imgAttributes);

//使用set clip&要绘制的区域