我正在更改图标颜色,到目前为止工作,但现在我的像素正在失去透明度,即使我积极尝试防止这种情况。这是我的代码:
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);
}
答案 0 :(得分:0)
您可能没有使用正确的PixelFormat
。格式需要支持四字节像素。请参阅以下相关问题,了解如何更改格式:Converting Bitmap PixelFormats in C#。
编辑:您可以尝试使用图形绘制到您的位图,如以下帖子中所示:Icon to Image - transparency issue。此外,有一个article on CodeProject似乎正在做你想要的。