3

宛先ビットマップ(bmpDest)に描画しているマスクビットマップ(bmpMask)があります。両方のビットマップにはアルファチャネルがありますが、すでに不透明なコンテンツでいっぱいです。

私がやりたいのは、bmpMaskでGDI +の「Draw...」メソッドを使用して透明な領域を作成し、bmpMaskを描画したときにbmpDestが透けて見えるようにすることです。

もちろんgMask.DrawLine(Pens.Transparent, 0, y, wMax, y)、GDI +は設計どおりに機能し、透明な場合は何も描画しないため、bmpMaskに変更はありません。半透明の色でも、bmpMaskのピクセルのr、g、b値のみが更新されます。

しかし、私がやりたいのは、bmpMaskのアルファチャネルを変更して、bmpDestに描画されたときに透明になるようにするdrawメソッドを発行することです。私はこれをSetPixelまたはより高速な安全でないまたはマーシャルの代替手段で行うことができることを知っていますが、それははるかに複雑な解決策を引き起こすでしょう。ありがとう。

4

2 に答える 2

8

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

于 2012-12-20T20:59:52.573 に答える
1

私の知る限り、アルファチャネルを変更する唯一の方法は、あなたが言うように、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に設定してみて、それがどの色を単色/透明に出すかをどのように変えるかを確認してください。ただし、ビットマップのアルファチャネルを直接変更する必要がある場合は、次の方法で変更できます。GDI+のソフトエッジ画像。

于 2010-02-26T10:17:37.050 に答える