Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 位图.SetPixel未设置正确的颜色_C#_.net - Fatal编程技术网

C# 位图.SetPixel未设置正确的颜色

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++)

我有一个位图,我正在尝试对其应用alpha通道。这个alpha存在于一个二进制文件中,我能够读取其中的所有字节并获得正确的值。当我测试它时,Color.FromArgb也给出了正确的颜色。然而,当我在位图上调用SetPixel时,它不起作用-它的行为就像什么都没发生一样。我做错了什么

如果相关,则使用SharpZibLib从流创建位图

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();