我有一个应用程序,我已经做了一个256 x 256的远程图标.
我想知道如何使用icx文件中的256×256 png作为应用程序图标,并将其显示在窗体上的图片框中.
我正在使用VB.net,但C#中的答案是正确的.我在想我可能不得不使用反思.
编辑!不知道在XP中是否可能,可能需要vista API
谢谢.
解决方法
今天,我从Vista图标中提取了256×256位图.
像Nathan W一样,我使用它在“关于”框中显示大图标作为位图.例如,此代码将Vista图标作为PNG图像,并将其显示在256×256 PictureBox中:
picBoxApplogo.Image = ExtractVistaIcon(myIcon);
此功能将Icon对象作为参数.所以,您可以使用任何图标 – 从资源,文件,流等. (请阅读下面关于提取EXE图标).
它运行在任何操作系统上,因为它不使用任何Win32 API,它是100%托管代码:-)
// Based on: http://www.codeproject.com/KB/cs/IconExtractor.aspx // And a hint from: http://www.codeproject.com/KB/cs/IconLib.aspx Bitmap ExtractVistaIcon(Icon icoIcon) { Bitmap bmpPngExtracted = null; try { byte[] srcBuf = null; using (System.IO.MemoryStream stream = new System.IO.MemoryStream()) { icoIcon.Save(stream); srcBuf = stream.ToArray(); } const int SizeICONDIR = 6; const int SizeICONDIRENTRY = 16; int iCount = BitConverter.ToInt16(srcBuf,4); for (int iIndex=0; iIndex<iCount; iIndex++) { int iWidth = srcBuf[SizeICONDIR + SizeICONDIRENTRY * iIndex]; int iHeight = srcBuf[SizeICONDIR + SizeICONDIRENTRY * iIndex + 1]; int iBitCount = BitConverter.ToInt16(srcBuf,SizeICONDIR + SizeICONDIRENTRY * iIndex + 6); if (iWidth == 0 && iHeight == 0 && iBitCount == 32) { int iImageSize = BitConverter.ToInt32(srcBuf,SizeICONDIR + SizeICONDIRENTRY * iIndex + 8); int iImageOffset = BitConverter.ToInt32(srcBuf,SizeICONDIR + SizeICONDIRENTRY * iIndex + 12); System.IO.MemoryStream destStream = new System.IO.MemoryStream(); System.IO.BinaryWriter writer = new System.IO.BinaryWriter(destStream); writer.Write(srcBuf,iImageOffset,iImageSize); destStream.Seek(0,System.IO.SeekOrigin.Begin); bmpPngExtracted = new Bitmap(destStream); // This is PNG! :) break; } } } catch { return null; } return bmpPngExtracted; }
重要!如果要直接从EXE文件加载该图标,则不能使用Icon.ExtractAssociatedIcon(Application.ExecutablePath)作为参数,因为.NET函数ExtractAssociatedIcon()非常愚蠢,它只能提取32×32图标!
相反,您最好使用由Tsuda Kageyu(http://www.codeproject.com/KB/cs/IconExtractor.aspx)创建的整个IconExtractor类.您可以稍微简化这个类,使其更小.这样使用IconExtractor:
// Getting FILL icon set from EXE,and extracting 256x256 version for logo... using (TKageyu.Utils.IconExtractor IconEx = new TKageyu.Utils.IconExtractor(Application.ExecutablePath)) { Icon icoAppIcon = IconEx.GetIcon(0); // Because standard System.Drawing.Icon.ExtractAssociatedIcon() returns ONLY 32x32. picBoxApplogo.Image = ExtractVistaIcon(icoAppIcon); }
注意:我仍然使用我的ExtractVistaIcon()函数,因为我不喜欢IconExtractor处理这个工作 – 首先,它使用IconExtractor.SplitIcon(icoAppIcon)提取所有图标格式,然后你必须知道确切的256×256图标索引,以获得所需的vista图标.所以,使用我的ExtractVistaIcon()这里是更快更简单的方法:)