ico格式是我们常见的一种图标格式,曾经常常通过一些别的软件进行转换,现在研究了一下C#其实也可以进行转换。

网上很多方法是通过Bitmap直接获取句柄转为Icon对象并保存,这样得到的ico质量非常差,左找右找发现可以直接读取图像全部信息,然后先写入ico文件头,再填入图像信息,即可实现无损转换。

首先来看一下ico文件的结构:

ico文件结构解析

根据这个,我们可以使用C#中的BinaryWriter类实现头信息写入,并追加图像体。

为了保证ico保留透明度且不失真,我们将图片读取为png格式数据,再将数据写入目标文件。这里我写了个函数来实现图片转换ico:

/// <summary>
/// 图片转换为ico文件
/// </summary>
/// <param name="origin">原图片路径</param>
/// <param name="destination">输出ico文件路径</param>
/// <param name="iconSize">输出ico图标尺寸,不可大于255x255</param>
/// <returns>是否转换成功</returns>
public static bool ConvertImageToIcon(string origin, string destination, Size iconSize)
{if (iconSize.Width > 255 || iconSize.Height > 255){return false;}Image image = new Bitmap(new Bitmap(origin), iconSize); //先读取已有的图片为bitmap,并缩放至设定大小MemoryStream bitMapStream = new MemoryStream(); //存原图的内存流MemoryStream iconStream = new MemoryStream(); //存图标的内存流image.Save(bitMapStream, ImageFormat.Png); //将原图读取为png格式并存入原图内存流BinaryWriter iconWriter = new BinaryWriter(iconStream); //新建二进制写入器以写入目标图标内存流/*** 下面是根据原图信息,进行文件头写入*/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);Stream iconFileStream = new FileStream(destination, FileMode.Create);Icon icon = new Icon(iconStream);icon.Save(iconFileStream); //储存图像/*** 下面开始释放资源*/iconFileStream.Close();iconWriter.Close();iconStream.Close();bitMapStream.Close();icon.Dispose();image.Dispose();return File.Exists(destination);
}

可见写入文件头时进行了多次Write操作,大家可以对照上面的ico格式解析图来看每一次都写入的什么信息,就明白了。也可见每次写入的数据甚至数据类型都不一样,这是因为每个数据类型的储存长度不同(byte为1字节,short为2字节,int为4字节)。因为根据上图得知ico文件头的每一个信息的长度也不一样,所以这里要对应起来。

调用函数即可实现转换,例如我这里输出一个128x128的ico文件:

convertImageToIcon(@"C:\Users\swsk33\Pictures\头像与图标\1.png", @"E:\中转\icon.ico", new Size(128, 128));

C#实现把图片转换为ico格式相关推荐

  1. 将图片转换为ico格式

    如何将图片保存为ico格式,我看了网上很多的网页直接更改,发现很多会更改了原来的尺寸大小,所以后来搜索发现一种新的方法,主要使用如下: 1.首先选择一个需要的图片格式是png的,这个可以通过截图的方式 ...

  2. 使用python将图片格式转换为ico格式

    因为python打包的时候需要用到ico图片格式,网上看好的图片又没有ico,于是自己寻找了一下python转换图片格式的方法,彻底解决这个问题,以后就可以自己轻松实现转化了,代码如下: " ...

  3. python3把jpg png图片转换为ico图标

    环境ubuntu 20.04系统,python3 需要安装PythonMagick,然后可以直接调用PythonMagick包了.window暂时没有测试. sudo apt-get install ...

  4. win10 设置滑动关机以及修改图片为ico格式

    设置滑动关机 之前看了一个视频,TOPBOOK : Win10 系统中,你可能不知道的五个小秘密.其中,滑动关机我觉得很有意思(有逼格). 设置很简单,在桌面创建一个快捷方式,弹出下面的界面. 输入下 ...

  5. 将BMP 格式图片转换为 JPEG 格式【c语言】

    源码链接: https://blog.csdn.net/qq_44394952/article/details/122587475?spm=1001.2014.3001.5502. 一.任务及目标 利 ...

  6. 如何批量将 bmp 格式图片转换为 png 格式

    概要:bmp 格式是纹的操作系统当中非常常见的一种图片格式,这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,所以导致了它存在一个很大的缺点,那就是占用磁盘空间过大,那么我们怎么将 bmp 格式的 ...

  7. java gif转jpg_Java gif图片转换为jpg格式

    下面通过代码给大家介绍Java gif图片转换为jpg格式,具体代码如下所示: if(fileName.toLowerCase().endsWith(".gif")){//由于头像 ...

  8. java gif转jpg_Java gif图片转换为jpg格式|chu

    下面通过代码给大家介绍Java gif图片转换为jpg格式,具体代码如下所示: if(fileName.toLowerCase().endsWith(".gif")){//由于头像 ...

  9. java gif jpg_Java gif图片转换为jpg格式

    下面通过代码给大家介绍Java gif图片转换为jpg格式,具体代码如下所示: if(fileName.toLowerCase().endsWith(".gif")){//由于头像 ...

最新文章

  1. Nature:麻省理工人造「巨型原子」问世,量子处理和量子通信合二为一
  2. 系统管理工具top、glances、dstat比较
  3. python 模拟微信浏览器请求_使用Chrome修改user agent模拟微信内置浏览器
  4. 第一篇 著名函数之单值函数
  5. 百度AI快车道南京站来了!接力魔都,继续听前沿技术、学最IN的解决方案
  6. 由return联想到的
  7. 逆向学习-IDApython(一)
  8. rpc协议微服务器,RPC协议及实现方式(分布式微服务治理的核心)
  9. HTML+CSS+JS实现 ❤️HTML5图片幻灯片轮播切换❤️
  10. mysql搭建主从结点
  11. 阿里表结构设计mysql_阿里华为P8级架构师教你MySQL数据库设计三范式与反范式
  12. phpquery中文手册
  13. 用Python全自动下载抖音视频!
  14. 如何查看网站服务器的速度,如何测试网站服务器访问速度?
  15. IOS Label下划线 中划线
  16. 提问 未来计算机的发展趋势是什么,计算机今后的发展趋势是什么?
  17. GAT解读graph attention network
  18. c语言中怎么调用自己定义的函数,c语言中怎么调用自己定义的函数?
  19. iphone 分享到twitter
  20. 青蛙过河c语言游戏素材,博客里可爱小FLASH,超级搞笑和一款智力青蛙过河游戏..据说很少人能过河哟...

热门文章

  1. 2020年十大币预测_2020年的5种技术预测
  2. 交行android平板,交通银行福利:Lenovo 联想 TAB 2 A7 小平板
  3. 开源DirectShow分析器和解码器: LAV Filter
  4. bzoj刷题(shui)记录
  5. Soundex UVA - 10260(soundex编码)(水)(略坑)
  6. 手机重力感应控制电脑(一)
  7. 2021年11月软考网络规划设计师下午真题及答案解析
  8. 基于C++和QT实现的个人通讯录管理系统
  9. 阿里云天池大赛赛题解析——机器学习篇 | 留言赠书
  10. Mybatis中按照年、季度、月、日、最近七天,查询