C# 位图.SetPixel未设置正确的颜色
我有一个位图,我正在尝试对其应用alpha通道。这个alpha存在于一个二进制文件中,我能够读取其中的所有字节并获得正确的值。当我测试它时,Color.FromArgb也给出了正确的颜色。然而,当我在位图上调用SetPixel时,它不起作用-它的行为就像什么都没发生一样。我做错了什么 如果相关,则使用SharpZibLib从流创建位图C# 位图.SetPixel未设置正确的颜色,c#,.net,C#,.net,我有一个位图,我正在尝试对其应用alpha通道。这个alpha存在于一个二进制文件中,我能够读取其中的所有字节并获得正确的值。当我测试它时,Color.FromArgb也给出了正确的颜色。然而,当我在位图上调用SetPixel时,它不起作用-它的行为就像什么都没发生一样。我做错了什么 如果相关,则使用SharpZibLib从流创建位图 for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++)
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
var c = imageData.GetPixel(x, y);
var a = alphaMask[y*width + x];
imageData.SetPixel(x, y, Color.FromArgb(a, c));
}
}
这在不替换透明颜色的情况下添加了alpha通道,并且从长远来看内存使用量最小。可能是预乘alpha与非预乘alpha的问题 但我建议完全避免
GetPixel
/SetPixel
。他们非常非常慢。锁定图像数据并直接对其进行处理。在调用SetPixel()之前,需要调用MakeTransparnet()
请参见您将图像保存为什么格式?图像不会保存,而是在内存中完成,以便可以预览。如果我试图设置每个字节的alpha值(使用锁定位),我会修改第一个字节,然后每三个字节修改一次,对吗?我遵循这里给出的示例:您需要修改每4个字节,因为您有4个通道,每个通道有8位。alpha通道很有可能是第四个字节。应该很容易测试。太棒了,谢谢!我仍然没有在我的代码中完全正确,但我可以告诉你这是正确的轨道。再次感谢!你的也可以,但我需要更快的东西(我可能会在以后的精灵表动画中使用一些非常大的图像)嗯。事实证明,我需要使用你的建议,使其透明,以及有一个阿尔法为每个像素以及。我希望我能接受你的两个答案,因为他们没有把我带到那里。
var bmp = new Bitmap(imageStream);
var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
var upgradedBmp = bmp.Clone(rect, PixelFormat.Format32bppArgb);
bmp.Dispose();