当前位置: 首页 > 编程语言 > C#

如何在C#中创建包含多个大小-图像的图标文件分享

时间:2023-04-10 16:09:40 C#

C#学习教程:如何在C#中创建包含多种尺寸/图片的图标文件我知道我使用Icon.FromHandle()从位图中创建图标,但如何向该图标添加另一个图像/尺寸?编辑:我需要在我的应用程序中执行此操作,因此我无法使用外部应用程序来进行合成。QuickCYA:我只是做了一个谷歌搜索,并没有测试下面的方法。它因人而异。我发现这篇文章提到了一个类可以做到这一点(尽管是在VB.Net中,它很容易翻译)并告诉他如何使用它。虽然线程指向的页面似乎不再显示提到的源代码,但我确实在这里找到了它的一个版本。我正在寻找一种将.png文件(没有任何花哨的东西)组合成一个图标的方法。我找不到简单的问题,这个问题是最热门的搜索结果,我在下面创建了代码。如果对于每张图片,Image.RawFormat为ImageFormat.Png,Image.PixelFormat为PixelFormat.Format32bppArgb且尺寸小于或等于256x256,则以下代码可以创建多种尺寸的图标://////提供方法创建图标。///publicclassIconFactory{#region常量//////表示图标的最大允许宽度。///publicconstintMaxIconWidth=256;//////表示图标的最大允许高度。///publicconstintMaxIconHeight=256;私人常量ushortHeaderReserved=0;privateconstushortHeaderIconType=1;私有常量字节HeaderLength=6;私有常量字节EntryReserved=0;PngColorsInPalette=0;privateconstushortPngColorPlanes=1;#endregion#region方法//////将指定的对象作为单个///图标保存到输出流中。//////要保存为图标的位图。///输出流。//////参数的预期输入是///便携式网络图形文件有一个///并且///宽度小于或等于并且///高度小于或等于。/////////如果任何输入图像///不符合要求的图像格式,则发生。详情见备注。/////////如果任何参数为空,则发生。///publicstaticvoidSavePngsAsIcon(IEnumerableimages,Streamstream){if(images==null)thrownewArgumentNullException("images");}if(stream==null)thrownewArgumentNullException("stream");//验证pngIconFactory.ThrowForInvalidPngs(images);位图[]orderedImages=images.OrderBy(i=>i.Width).ThenBy(i=>i.Height).ToArray();using(varwriter=newBinaryWriter(stream)){//写入标头writer.Write(IconFactory.HeaderReserved);writer.Write(IconFactory.HeaderIconType);writer.Write((ushort)orderedImages.Length);//保存图像缓冲区和偏移Dictionarybuffers=newDictionary();//跟踪缓冲区的长度作为迭代器操作发生//并将其添加到条目的偏移量uintlengthSum=0;uintbaseOffset=(uint)(IconFactory.HeaderLength+IconFactory.EntryLength*orderedImages.Length);for(inti=0;iimages){foreach(varimageinimages){if(image.PixelFormat!=PixelFormat.Format32bppArgb){thrownewInvalidOperationException(string.Format("所需的像素格式为PixelFormat。{0}。",PixelFormat.Format32bppArgb.ToString()));}if(image.RawFormat.Guid!=ImageFormat.Png.Guid){thrownewInvalidOperationException("所需图像格式为可移植网络图形(png)。");}if(image.Width>IconFactory.MaxIconWidth||image.Height>IconFactory.MaxIconHeight){thrownewInvalidOperationException(string.Format("尺寸必须小于或等于{0}x{1}",IconFactory.MaxIconWidth,IconFactory.MaxIconHeight));}}}privatestaticbyteGetIconHeight(Bitmapimage){if(image.Height==IconFactory.MaxIconHeight)返回0;返回(byte)image.Height;}privatestaticbyteGetIconWidth(Bitmapimage){if(image.Width==IconFactory.MaxIconWidth)return0;返回(字节)图像。宽度;}privatestaticbyte[]CreateImageBuffer(Bitmapimage){使用(varstream=newMemoryStream()){image.Save(stream,image.RawFormat);返回stream.ToArray();}}#endregion}用法:使用(varpng16=(Bitmap)Bitmap.FromFile(@"C:Test3dGlasses16.png"))使用(varpng32=(Bitmap)Bitmap.FromFile(@"C:Test3dGlasses32.png"))使用(varstream=newFileStream(@"C:TestCombined.ico",FileMode.Create)){IconFactory.SavePngsAsIcon(new[]{png16,png32},stream);这可以使用IconLib来完成。您可以从CodeProject文章中获取源代码,或者从我的GitHub镜像中获取编译后的dll。publicvoidConvert(stringpngPath,stringicoPath){MultiIconmIcon=newMultiIcon();mIcon.Add("Untitled").CreateFrom(pngPath,IconOutputFormat.FromWin95);mIcon.SelectedIndex=0;mIcon.Save(icoPath,MultiIconFormat.ICO);}CreateFrom可以采用指向256×256png或System.Drawing.Bitmap对象的路径。您不能使用System.DrawingAPI创建图标。它们是为访问图标文件中的特定图标而构建的,而不是为将多个图标写回.ico文件而构建的。如果您只想制作一个图标,您可以使用GIMP或其他图像处理程序来创建.ico文件。否则,如果您确实需要以编程方式创建.ico文件,则可以使用png2ico(通过System.Diagnostics.Process.Start调用)或类似的东西。使用IcoFX:http://icofx.ro/它可以创建Windows图标并在1个ico文件中存储多种尺寸和颜色以上是C#学习教程:Howtocreateaniconfilewithmultiplesizes/imagesinC#如果所有分享的内容对你很有用,需要了解更多的C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: