0

画像に穴を開けるなど、透明度のある領域をビットマップに「描画」しようとしています。

次のコードは透明線を描画しません。これは、ビットマップに透明線を描画すると、もちろん置換ではなくブレンドされるためです。(デフォルトで2つの描画操作のうち、より複雑な操作が行われるのはなぜですか。意味がありません。)

Bitmap myBitmap = new Bitmap(50, 50);
Graphics g = Graphics.FromImage(myBitmap);
g.FillRectangle(Brushes.Black, 0, 0, 50, 50);
g.FillEllipse(Brushes.Transparent, 25, 0, 25, 25); //Does nothing
g.DrawLine(Pens.Transparent, 0, 0, 50, 50); //Does nothing

透明な円と線がブレンドではなくビットマップの内容を置き換えるように、これをどのように変更しますか?

(これは完全な透明度を「描画」する簡単なケースであることに注意してください。私が目指しているのは、ピクセルごとの操作で独自のピクセルを作成せずに、アルファチャネルを「描画」する機能だけです。完全な透明度を実行できるようになると、でも十分です。)


重複として提案された記事の回答に続いて、私は次のことも試しました(これは機能しません)

        base.OnPaint(e);
        Bitmap myBitmap = new Bitmap(50, 50);
        e.Graphics.FillRectangle(Brushes.Black, 0, 0, 50, 50);
        Graphics g = Graphics.FromImage(myBitmap);
        g.FillEllipse(new SolidBrush(Color.FromArgb(150, 125, 125, 125)), 25, 0, 25, 25);
        g.DrawLine(new Pen(Color.FromArgb(150,25,25,25)), 0, 0, 50, 50);
        g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
        e.Graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
        e.Graphics.DrawImage(myBitmap, 0, 0);

また、これをテストしましたSourceCopy

4

1 に答える 1

2

これは私にとっては完全にうまくいきます

Bitmap bmp = new Bitmap(50, 50, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
using (Graphics g = Graphics.FromImage(bmp))
{
    g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
    g.FillRectangle(Brushes.Black, 0, 0, 50, 50);
    g.FillEllipse(Brushes.Transparent, 25, 0, 25, 25);
    g.DrawLine(Pens.Transparent, 0, 0, 50, 50);
    g.Flush();
}
bmp.Save("Test.bmp");
于 2013-02-22T21:53:06.997 に答える