.NET环境下c#实现图片PNG、JPG转ico,可用于程序logo图标
ico的应用场景
最近一直在开发桌面的wpf程序应用,加上之前也一直在开发控制台类型的桌面程序,掐指一算一个单业务项目正常运行下来得部署8个+的窗口同时跑,之前每次发布一个程序就会单独做一个app图标加以区分方便维护,图标都是在网上找工具弄的,这次就想着自己做一个方便自己使用 一方面可以实践下,另一方面原因也是不想看成堆的页面广告。成品就是博客工具箱里的《Ico图标在线生成工具》 下面放了链接
最开始开发在线ico转换工具是考虑用javascript + canvas进行纯前端方式实现以节省服务器资源,但是做好后发现这钟方式生成的ico图标 虽然可以正常打开也可以作为网站图标来使用,但是导入exe项目作为图标是会报错提示 不包含标准的图标流, 尝试多次依然无法解决最后选择了用后端服务器用.net进行转换完成后返回给前端 ,经过测试可以作为应用程序的图标使用
图片转ico的c#代码实现
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();
}
}
}
}
}
}