3

我有一个蒙版位图 (bmpMask),我正在将其绘制到目标位图 (bmpDest) 上。两个位图都有 Alpha 通道,但已经充满了不透明的内容。

我想要做的是在 bmpMask 上使用 GDI+ 'Draw...' 方法生成透明区域,这样当我在它上面绘制 bmpMask 时,bmpDest 就会显示出来。

当然gMask.DrawLine(Pens.Transparent, 0, y, wMax, y)不会对 bmpMask 造成任何改变,因为 GDI+ 按设计工作,并且在透明时不会绘制任何内容。即使使用半透明颜色,也只会更新 bmpMask 像素的 r、g、b 值。

但我想要做的是发出一个绘制方法,该方法将改变 bmpMask 的 alpha 通道,因此在绘制到 bmpDest 时它是透明的。我知道我可以使用 SetPixel 或更快的 unsafe 或 Marshall 替代方案来做到这一点,但这会导致更复杂的解决方案。谢谢。

4

2 回答 2

8

3年后找到“答案”!

我从来没有尝试过 Dan 的解决方案,所以我不想放弃它,但这正是我想要的:

    ' (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

于 2012-12-20T20:59:52.573 回答
1

据我所知,改变 alpha 通道的唯一方法是,如您所说,使用 SetPixel 或(当然,更好的)指针。根据您要执行的操作,您可以创造性地使用 ColorMatrix。这将使您可以更改 DrawImage 操作,以便在绘制时可以互换 R/G/B/A 的含义。试试这个以获得一个想法:

        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+ 中的软边图像。

于 2010-02-26T10:17:37.050 回答