質問

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

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

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

しかし、私がやりたいのは、bmpMask のアルファ チャネルを変更する描画メソッドを発行して、bmpDest に描画されるときに透明になるようにすることです。SetPixel や、より高速なアンセーフ、または Marshall の代替手段を使用してこれを実行できることはわかっていますが、そうすると解決策がさらに複雑になります。ありがとう。

役に立ちましたか?

解決

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が鍵です!私はようやく私のプログラムでは、再びこの不足を解決しようとしていた、とGoogleは、私は(ちょっと、あなたの心を読むことができるグーグル)で検索するものとは何の関係もありません。この項目を上げて検索ます。

は大きなイメージに遅すぎるGraphics.drawImageをですか?

ワンダフル!今、10ドルは全体広い世界で誰もこれを読まない、と言います。 755

他のヒント

私の知る限り、アルファ チャネルを変更する唯一の方法は、あなたが言うように、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+ のソフトエッジ画像。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top