擦除透明度

时间:2013-06-12 19:07:03

标签: c# gdi+

所以我试图让32x32的块恢复透明,但每当我尝试将其设置为透明时它只保留已经存在的东西,我想要将图像上的内容擦除为透明,这是我试过的代码。

    public Bitmap erase_tile(Bitmap bitmap, int x, int y)
    {
        Graphics device = Graphics.FromImage(bitmap);

        Brush brush = new SolidBrush(Color.FromArgb(0, Color.White));

        device.FillRectangle(brush, new Rectangle(x * 32, y * 32, 32, 32));
        return bitmap;
    }

2 个答案:

答案 0 :(得分:1)

所有透明度都将通过Bitmap类的功能完成。 Graphics类面向绘图,绘图Color.Transparent基本上是无操作。

您可以Bitmap.SetPixel()Color.Transparent一起使用来设置单个像素。

或者您可以执行以下操作:使用Graphics绘制虚拟颜色,然后指示位图用作透明颜色。

using (var graphics = Graphics.FromImage(bmp))
{
    graphics.FillRectangle(Brushes.Red, 0, 0, 64, 64);
    graphics.FillRectangle(Brushes.Magenta, 16, 16, 32, 32);
}
bmp.MakeTransparent(Color.Magenta);

答案 1 :(得分:0)

当我在寻找相同的解决方案时,我无法找到确切的答案,所以经过一些实验后我遇到了SetCompositingMode并且它成功了(请参考Using Compositing Mode to Control Alpha Blending完整详情)。

以下是C ++中用于演示该方法的工作代码(需要在C#中重用一些调优):

void SetTransparent(Gdiplus::Image* image, IN INT x, IN INT y, IN INT width, IN INT height)
{
    Gdiplus::Graphics graph(image);
    graph.SetCompositingMode(Gdiplus::CompositingModeSourceCopy);
    Gdiplus::SolidBrush transparent(0);
    graph.FillRectangle(&transparent, x, y, width, height);
}