ico的应用场景
最近一直在开发桌面的wpf程序应用,加上之前也一直在开发控制台类型的桌面程序,掐指一算一个单业务项目正常运行下来得部署8个+的窗口同时跑,之前每次发布一个程序就会单独做一个app图标加以区分方便维护,图标都是在网上找工具弄的,这次就想着自己做一个方便自己使用 一方面可以实践下,另一方面原因也是不想看成堆的页面广告。 ~~工具成品就是博客工具箱里的《Ico图标在线生成工具》(已下架) ~~
最开始开发在线ico转换工具是考虑用javascript + canvas进行纯前端方式实现以节省服务器资源,但是做好后发现这钟方式生成的ico图标 虽然可以正常打开也可以作为网站图标来使用,但是导入exe项目作为图标是会报错提示 不包含标准的图标流, 尝试多次依然无法解决最后选择了用后端服务器用.net进行转换完成后返回给前端 。
图片转ico的c#代码实现
tips:经过测试可以作为应用程序的图标使用
public static byte[] ConvertImageToIcon(this Image origin, int size) { if (size > 255 || size > 255) { return null; } Size iconSize = new Size(size, size); using (Image image = new Bitmap(origin, iconSize)) { using (MemoryStream bitMapStream = new MemoryStream()) { using (MemoryStream iconStream = new MemoryStream()) { image.Save(bitMapStream, ImageFormat.Png); //将原图读取为png格式并存入原图内存流 using (Stream iconFileStream = new MemoryStream()) { using (BinaryWriter iconWriter = new BinaryWriter(iconStream)) { //vs识别读取不出来可能就是因为这里 iconWriter.Write((short)0); iconWriter.Write((short)1); iconWriter.Write((short)1); iconWriter.Write((byte)image.Width); iconWriter.Write((byte)image.Height); iconWriter.Write((short)0); iconWriter.Write((short)0); iconWriter.Write((short)32); iconWriter.Write((int)bitMapStream.Length); iconWriter.Write(22); //写入图像体至目标图标内存流 iconWriter.Write(bitMapStream.ToArray()); //保存流,并将流指针定位至头部以Icon对象进行读取输出为文件 iconWriter.Flush(); iconWriter.Seek(0, SeekOrigin.Begin); Icon icon = new Icon(iconStream); icon.Save(iconFileStream); //储存图像 iconFileStream.Seek(0, SeekOrigin.Begin); /**下面开始释放资源**/ iconStream.Close(); bitMapStream.Close(); icon.Dispose(); image.Dispose(); return iconFileStream.ConvertToBytes(); } } } } } }