1

所以我试图将一个 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;
    }
4

2 回答 2

2

所有的透明度都将通过Bitmap类上的功能来实现。该Graphics课程面向绘图,绘图Color.Transparent本质上是无操作的。

您可以使用Bitmap.SetPixel()withColor.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);
于 2013-06-12T19:32:47.127 回答
0

当我在寻找相同的解决方案时,我无法找到确切的答案,所以经过一些实验后,我发现SetCompositingMode并成功了(有关详细信息,请参阅使用合成模式控制 Alpha 混合)。

这是一个 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);
}
于 2017-10-14T01:19:21.030 回答