如何在不失去透明度的情况下将图像转换为图标?

我有PNG图像,我需要在显示之前将其转换为图标。

这就是我做的方式:

public Icon ImageToIcon(Image imgTest) { Bitmap bitmap = new Bitmap(imgTest); Icon icoTest; IntPtr iPtr = bitmap.GetHicon(); icoTest = (Icon) Icon.FromHandle(iPtr).Clone(); return icoTest; } 

这样做后我失去了透明度,alpha透明图像没有按预期渲染….这可以解决吗?

不,还有很多东西。 图标具有相当精细的内部结构,经过优化,可在20世纪80年代的硬件上合理运行。 图标图像有三个位图,一个用于图标,一个单色位图指示图像的哪些部分是透明的,另一个单色位图指示哪些部分是反转的。 生成那些单色位图非常痛苦,.NET不支持它们。 Bitmap.GetHicon()也没有尝试它。 您需要一个库来为您完成工作。

Vista给了一些缓解,它开始支持包含PNG图像的图标。 您可以使用自己的代码生成它。 像这样:

  public static Icon IconFromImage(Image img) { var ms = new System.IO.MemoryStream(); var bw = new System.IO.BinaryWriter(ms); // Header bw.Write((short)0); // 0 : reserved bw.Write((short)1); // 2 : 1=ico, 2=cur bw.Write((short)1); // 4 : number of images // Image directory var w = img.Width; if (w >= 256) w = 0; bw.Write((byte)w); // 0 : width of image var h = img.Height; if (h >= 256) h = 0; bw.Write((byte)h); // 1 : height of image bw.Write((byte)0); // 2 : number of colors in palette bw.Write((byte)0); // 3 : reserved bw.Write((short)0); // 4 : number of color planes bw.Write((short)0); // 6 : bits per pixel var sizeHere = ms.Position; bw.Write((int)0); // 8 : image size var start = (int)ms.Position + 4; bw.Write(start); // 12: offset of image data // Image data img.Save(ms, System.Drawing.Imaging.ImageFormat.Png); var imageSize = (int)ms.Position - start; ms.Seek(sizeHere, System.IO.SeekOrigin.Begin); bw.Write(imageSize); ms.Seek(0, System.IO.SeekOrigin.Begin); // And load it return new Icon(ms); } 

在.NET 4.5和Windows 8.1上测试过。 请注意,在边缘具有透明度的PNG图像上,您会看到“条纹”的可能性。 这仅在图像以众所周知的背景颜色显示时才有效。 根据设计,图标永远不会依赖。 专用的图标编辑器永远是获得漂亮图标的唯一真正好方法。