C#实现把图片转换为ico格式
ico格式是我们常见的一种图标格式,曾经常常通过一些别的软件进行转换,现在研究了一下C#其实也可以进行转换。
网上很多方法是通过Bitmap直接获取句柄转为Icon对象并保存,这样得到的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格式相关推荐
- 将图片转换为ico格式
如何将图片保存为ico格式,我看了网上很多的网页直接更改,发现很多会更改了原来的尺寸大小,所以后来搜索发现一种新的方法,主要使用如下: 1.首先选择一个需要的图片格式是png的,这个可以通过截图的方式 ...
- 使用python将图片格式转换为ico格式
因为python打包的时候需要用到ico图片格式,网上看好的图片又没有ico,于是自己寻找了一下python转换图片格式的方法,彻底解决这个问题,以后就可以自己轻松实现转化了,代码如下: " ...
- python3把jpg png图片转换为ico图标
环境ubuntu 20.04系统,python3 需要安装PythonMagick,然后可以直接调用PythonMagick包了.window暂时没有测试. sudo apt-get install ...
- win10 设置滑动关机以及修改图片为ico格式
设置滑动关机 之前看了一个视频,TOPBOOK : Win10 系统中,你可能不知道的五个小秘密.其中,滑动关机我觉得很有意思(有逼格). 设置很简单,在桌面创建一个快捷方式,弹出下面的界面. 输入下 ...
- 将BMP 格式图片转换为 JPEG 格式【c语言】
源码链接: https://blog.csdn.net/qq_44394952/article/details/122587475?spm=1001.2014.3001.5502. 一.任务及目标 利 ...
- 如何批量将 bmp 格式图片转换为 png 格式
概要:bmp 格式是纹的操作系统当中非常常见的一种图片格式,这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,所以导致了它存在一个很大的缺点,那就是占用磁盘空间过大,那么我们怎么将 bmp 格式的 ...
- java gif转jpg_Java gif图片转换为jpg格式
下面通过代码给大家介绍Java gif图片转换为jpg格式,具体代码如下所示: if(fileName.toLowerCase().endsWith(".gif")){//由于头像 ...
- java gif转jpg_Java gif图片转换为jpg格式|chu
下面通过代码给大家介绍Java gif图片转换为jpg格式,具体代码如下所示: if(fileName.toLowerCase().endsWith(".gif")){//由于头像 ...
- java gif jpg_Java gif图片转换为jpg格式
下面通过代码给大家介绍Java gif图片转换为jpg格式,具体代码如下所示: if(fileName.toLowerCase().endsWith(".gif")){//由于头像 ...
最新文章
- Nature:麻省理工人造「巨型原子」问世,量子处理和量子通信合二为一
- 系统管理工具top、glances、dstat比较
- python 模拟微信浏览器请求_使用Chrome修改user agent模拟微信内置浏览器
- 第一篇 著名函数之单值函数
- 百度AI快车道南京站来了!接力魔都,继续听前沿技术、学最IN的解决方案
- 由return联想到的
- 逆向学习-IDApython(一)
- rpc协议微服务器,RPC协议及实现方式(分布式微服务治理的核心)
- HTML+CSS+JS实现 ❤️HTML5图片幻灯片轮播切换❤️
- mysql搭建主从结点
- 阿里表结构设计mysql_阿里华为P8级架构师教你MySQL数据库设计三范式与反范式
- phpquery中文手册
- 用Python全自动下载抖音视频!
- 如何查看网站服务器的速度,如何测试网站服务器访问速度?
- IOS Label下划线 中划线
- 提问 未来计算机的发展趋势是什么,计算机今后的发展趋势是什么?
- GAT解读graph attention network
- c语言中怎么调用自己定义的函数,c语言中怎么调用自己定义的函数?
- iphone 分享到twitter
- 青蛙过河c语言游戏素材,博客里可爱小FLASH,超级搞笑和一款智力青蛙过河游戏..据说很少人能过河哟...
热门文章
- 2020年十大币预测_2020年的5种技术预测
- 交行android平板,交通银行福利:Lenovo 联想 TAB 2 A7 小平板
- 开源DirectShow分析器和解码器: LAV Filter
- bzoj刷题(shui)记录
- Soundex UVA - 10260(soundex编码)(水)(略坑)
- 手机重力感应控制电脑(一)
- 2021年11月软考网络规划设计师下午真题及答案解析
- 基于C++和QT实现的个人通讯录管理系统
- 阿里云天池大赛赛题解析——机器学习篇 | 留言赠书
- Mybatis中按照年、季度、月、日、最近七天,查询