绘制形状GDI +是覆盖不透明像素的透明度
-
22-09-2019 - |
题
我有一个掩码位图(bmpMask),我绘制到目标位图(bmpDest)。这两个位图具有alpha通道,但已经充满了不透明的内容。
我想要做的就是使用产生GDI +透明区域“画......”上bmpMask方法是什么让bmpDest节目通过时,我画bmpMask了它。
当然gMask.DrawLine(Pens.Transparent, 0, y, wMax, y)
导致不改变bmpMask,因为GDI +工作原理设计的和透明的,当不绘制任何东西。即使有颜色半透明,仅R,G,bmpMask的像素的B值被更新。
但我想要做的是发出抽签方法,将改变bmpMask的alpha通道,所以当绘制到bmpDest它是透明的。我知道我可以用SetPixel或更快不安全或马歇尔替代做到这一点,但是这将导致一个更复杂的解决方案。感谢。
解决方案
找到 '的' 3年后的答案!
我从来没有得到解决,以试图丹的解决方案,所以我不希望从它拿走,但是这不正是我想要的:
' (setting composting mode is the key to getting the transparent
' line to actually result in setting the pixels to transparent-
' instead of just not drawing anything 'because it's transparent dummy' -
' because it turns off the 'math' that is done to cause transparent
' image drawing to occur and just verbatim copies the bits).
g1.CompositingMode = Drawing2D.CompositingMode.SourceCopy
g1.DrawLine(Pens.Transparent, 0, y, wMax, y)
g1.CompositingMode = Drawing2D.CompositingMode.SourceOver
CompostingMode
是关键!我终于想在我的程序再次解决这个问题缺乏,以及谷歌搜索打开了这个项目有没有做什么,我搜索了(嘿嘿,谷歌可以了解你的心思)。
是Graphics.DrawImage太慢为更大的图像?一>
奇妙!现在10块钱说,没有人在整个世界不断读取此。 755
其他提示
据我所知,改变alpha通道的唯一方式是,如你所说,使用SetPixel或(当然,更好的)指针。根据您正在尝试做的,你的可能的通过创造性地使用一个嘉洛斯的得到了什么。这将让你在这样一种方式,可以互换R / G / B / A的含义在绘制时改变的DrawImage操作。试试这个来得到一个想法:
using ( var bmp = new Bitmap( 100, 100 ) )
using ( var g = Graphics.FromImage( bmp ) )
using ( var ia = new ImageAttributes() )
{
float R = 1;
float G = 0;
float B = 0;
ia.SetColorMatrix( new ColorMatrix( new float[][] {
new float[] {1, 0, 0, R, 0},
new float[] {0, 1, 0, G, 0},
new float[] {0, 0, 1, B, 0},
new float[] {0, 0, 0, 0, 0},
new float[] {0, 0, 0, 0, 1}} ) );
g.Clear( Color.White );
g.FillEllipse( Brushes.Blue, 10, 10, 30, 30 );
g.FillEllipse( Brushes.Red, 60, 10, 30, 30 );
g.FillEllipse( Brushes.Green, 10, 60, 30, 30 );
g.FillEllipse( Brushes.Black, 60, 60, 30, 30 );
e.Graphics.DrawImage(
bmp,
new Rectangle( 0, 0, 100, 100 ),
0, 0, 100, 100,
GraphicsUnit.Pixel,
ia );
}
尝试分别R / G / B设定为1,并看到变化如何什么颜色表示出来的固/透明。但是,如果你想改变直接位图的alpha通道,这里是如何做到这一点:的软在GDI +边缘图像。