擦除透明度

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

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; } 

所有透明度都将通过Bitmap类的function完成。 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); 

当我在寻找相同的解决方案时,我无法找到确切的答案,因此在经过一些实验后我遇到了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); }