为什么我会丢失像素alpha值
本文关键字:像素 alpha 为什么 | 更新日期: 2023-09-27 17:59:51
我正在更改图标颜色,到目前为止效果良好,但现在我的像素正在失去透明度,即使我积极尝试防止这种情况发生。这是我的代码:
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);
另一个问题是,我的图标(但不是单个图标框)的高度是原来的两倍,但宽度仍然相同。
编辑:
我将PixelFormat更改为Format32bppPArgb,这应该是我需要的透明度,还确保位图是从原始位图逐像素创建的,而不是复制和更改它。不过,同样的问题也会发生。
这是新的代码:
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);
}
您可能没有使用正确的PixelFormat
。该格式需要支持四字节像素。请参阅以下关于如何更改格式的相关问题:在C#中转换位图像素格式。
编辑:您可以尝试使用Graphics绘制位图,如以下文章中所建议的:图标到图像-透明度问题。此外,有一篇关于CodeProject的文章似乎正是在做你想做的事情。