为什么我会丢失像素值?

时间:2014-04-24 19:22:23

标签: c# visual-studio image-processing bitmap

我正在更改图标颜色,到目前为止工作,但现在我的像素正在失去透明度,即使我积极尝试防止这种情况。这是我的代码:

private static void ChangeColor()
    {
        foreach(MultiIcon mi in listMi)
            foreach (SingleIcon si in mi)
                for (int n = 0; n < si.Count(); n++)
                {
                    IconImage ii = si[n];
                    Bitmap bmp = new Bitmap(ii.Image);
                    for (int w = 0; w < bmp.Width; w++)
                        for (int h = 0; h < bmp.Height; h++)
                            if (bmp.GetPixel(w, h).R == identifier - uncertanty && bmp.GetPixel(w, h).R == identifier + uncertanty)
                                bmp.SetPixel(w, h, Color.FromArgb(bmp.GetPixel(w, h).A, r, g, b));
                    ii.Set(bmp, null, Color.Transparent);
                }
    }

使用此行,我会使用原始的alpha值并在设置新的(带有更改的颜色)像素时重复使用它。

bmp.SetPixel(w, h, Color.FromArgb(bmp.GetPixel(w, h).A, r, g, b));

这用于保存文件。 MultiIcon来自IconLib:

http://www.codeproject.com/Articles/16178/IconLib-Icons-Unfolded-MultiIcon-and-Windows-Vista

mi.Save(NewPath(pathArray[i]), MultiIconFormat.ICO);

另一个问题是,我的Icon(但不是单个图标框架)是高度的两倍,同时宽度相同。

编辑:

我将PixelFormat更改为Format32bppPArgb,这应该是我需要的透明度,也确保Bitmap从原始Pixel by Pixel创建,而不是复制和更改它。仍然存在同样的问题。

这是新的代码:

for (int n = 0; n < si.Count(); n++)
{
    IconImage ii = si[n];
    Bitmap bmp = new Bitmap(ii.Image.Height, ii.Image.Width, PixelFormat.Format32bppPArgb);
    for (int w = 0; w < bmp.Width; w++)
        for (int h = 0; h < bmp.Height; h++)
        {
            if (si[n].Image.GetPixel(w, h).R > identifier - uncertanty && si[n].Image.GetPixel(w, h).R < identifier + uncertanty)
                bmp.SetPixel(w, h, Color.FromArgb(si[n].Image.GetPixel(w, h).A, r, g, b));
            else
            {
                Color c = Color.FromArgb(       
                    si[n].Image.GetPixel(w, h).A, 
                    si[n].Image.GetPixel(w, h).R, 
                    si[n].Image.GetPixel(w, h).G, 
                    si[n].Image.GetPixel(w, h).B
                    );
                bmp.SetPixel(w, h, c);
            }
        }
    ii.Set(bmp, null, Color.Transparent);
}

1 个答案:

答案 0 :(得分:0)

您可能没有使用正确的PixelFormat。格式需要支持四字节像素。请参阅以下相关问题,了解如何更改格式:Converting Bitmap PixelFormats in C#

编辑:您可以尝试使用图形绘制到您的位图,如以下帖子中所示:Icon to Image - transparency issue。此外,有一个article on CodeProject似乎正在做你想要的。