C# 关于图片转ICO的代码整理(无损,不需要第三方类库)
概述(Overview)
感觉网上文章整理的不全,我这边做个专栏,专门做这个事情吧,节省大家搜索、筛选、整理的时间精力。有用可以点个赞。引用本文章请注明出处,谢谢。
(I feel that the online articles are not complete, so I will make a column here to do this thing, so as to save everyone's time and energy in searching, screening, and sorting. If it's useful, you can like it.Please indicate the source for citing this article, thank you.)
代码(Code)
using System;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Windows.Forms; public class ICON
{
/// <summary>
/// 保存为ICO文件
/// </summary>
/// <param name="filePath">文件路径</param>
/// <param name="width">宽度</param>
/// <param name="height">高度</param>
/// <returns>true:成功 false:失败</returns>
public static bool SaveAsICON(string filePath, int width = 0, int height = 0)
{
try
{
//基于源文件路径,仅修改后缀名为ico
string fileDirectory = Path.GetDirectoryName(filePath);
string fileSavePath = Path.Combine(fileDirectory, Path.GetFileNameWithoutExtension(filePath)) + ".ico"; using (Bitmap bm = new Bitmap(filePath))
{
//尺寸范围:【1-255,1-255】
width = width == 0 ? bm.Width : width;
width = width > 255 ? 255 : width; height = height == 0 ? bm.Height : height;
height = height > 255 ? 255 : height; //转换结果
bool isSuccess = ConvertImageToIcon(filePath, fileSavePath, new Size(width, height));
if (!isSuccess)
{
return isSuccess;
}
//转换成功,打开文本保存所在目录
Process.Start("explorer.exe", fileDirectory);
return isSuccess;
}
}
catch (Exception ex)
{
MessageBox.Show("转化失败。错误信息:" + ex.Message);
return false;
}
} /// <summary>
/// 图片转换为ico文件
/// </summary>
/// <param name="origin">原图片路径</param>
/// <param name="destination">输出ico文件路径</param>
/// <param name="iconSize">输出ico图标尺寸,不可大于255x255</param>
/// <returns>是否转换成功</returns>
private static bool ConvertImageToIcon(string origin, string destination, Size iconSize)
{
if (iconSize.Width > 255 || iconSize.Height > 255)
{
return false;
} Bitmap originBMP = new Bitmap(origin);
Image image = new Bitmap(originBMP, 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);//0-1保留
iconWriter.Write((short)1);//2-3文件类型。1=图标, 2=光标
iconWriter.Write((short)1);//4-5图像数量(图标可以包含多个图像)
iconWriter.Write((byte)image.Width);//6图标宽度
iconWriter.Write((byte)image.Height);//7图标高度
iconWriter.Write((short)0);//8颜色数(若像素位深>=8,填0。这是显然的,达到8bpp的颜色数最少是256,byte不够表示) ;9保留。必须为0
iconWriter.Write((short)0);//10-11调色板
iconWriter.Write((short)32);//12-13位深
iconWriter.Write((int)bitMapStream.Length);//14-17位图数据大小
iconWriter.Write(22); //18 - 21位图数据起始字节 //写入图像体至目标图标内存流
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();
originBMP.Dispose();
icon.Dispose();
image.Dispose();
iconFileStream.Dispose(); return File.Exists(destination);
} }
引用
图标(ico,cur)文件的结构解析_ico文件格式解析-CSDN博客
【C#】无损转换Image为Icon - ahdung - 博客园 (cnblogs.com)
C#图片无损转换为ico格式_c# png转32位 ico-CSDN博客
C# 关于图片转ICO的代码整理(无损,不需要第三方类库)的更多相关文章
- material design 的android开源代码整理
material design 的android开源代码整理 1 android (material design 效果的代码库) 地址请点击:MaterialDesignLibrary 效果: 2 ...
- IOS常用代码整理
常用代码整理: 12.判断邮箱格式是否正确的代码: //利用正则表达式验证 -(BOOL)isValidateEmail:(NSString *)email { NSString *emailRege ...
- 史上最全的CSS hack方式一览 jQuery 图片轮播的代码分离 JQuery中的动画 C#中Trim()、TrimStart()、TrimEnd()的用法 marquee 标签的使用详情 js鼠标事件 js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法 ref和out的区别在c#中 总结
史上最全的CSS hack方式一览 2013年09月28日 15:57:08 阅读数:175473 做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我 ...
- 基于CSS3和HTML5图片加工前后对比代码
分享一款CSS3和HTML5图片加工前后对比代码.这是一款通过CSS3和HTML5将图像转换为自动响应的元素:图像缩放和裁剪以适应容器.效果图如下: 在线预览 源码下载 实现的代码. html代码 ...
- Smtp邮件发送系统公用代码整理—总结
1.前言 a.在软件开发中,我们经常能够遇到给用户或者客户推送邮件,推送邮件也分为很多方式,比如:推送一句话,推送一个网页等等.那么在系统开发中我们一般在什么情况下会使用邮件发送呢?下面我简单总结了一 ...
- jQuery图片无缝滚动JS代码ul/li结构
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 实现图片大小的自动控制( 图片大小控制CSS代码)
图片大小控制CSS代码 将以下代码放到你的样式表文件中即可实现图片大小的自动控制. /*图片大小控制CSS By Tekin */img,a img{border:0;margin:0;padding ...
- Java 图片提取RGB数组 RGBOfCharMaps (整理)
package demo; /** * Java 图片提取RGB数组 RGBOfCharMaps (整理) * 声明: * 和ImageCombining配合使用的工具,这里是提取图片的R.G.B生成 ...
- Chrome应用技巧之代码整理。
我们有时候在看别人站点代码时往往是经过压缩的,代码都在一行上了,调试非常是困难,今天给大家介绍一种基本Chrome浏览器的代码整理方法.请看图:
- NSIS常用代码整理
原文 NSIS常用代码整理 这是一些常用的NSIS代码,少轻狂特意整理出来,方便大家随时查看使用.不定期更新哦~~~ 1 ;获取操作系统盘符 2 ReadEnvStr $R0 SYSTEMDRIVE ...
随机推荐
- Spring Cloud 核心组件之Spring Cloud Hystrix:服务容错保护
Spring Cloud Hystrix:服务容错保护 SpringCloud学习教程 SpringCloud Spring Cloud Hystrix 是Spring Cloud Netflix 子 ...
- redis 简单整理——内存的管理[二十六]
前言 redis 是一个内存型数据库,那么就需要重点关注一下内存了. 正文 理解Redis内存,首先需要掌握Redis内存消耗在哪些方面.有些内存消 耗是必不可少的,而有些可以通过参数调整和合理使用来 ...
- ImageJ软件使用教程(三):目标计数
目录 多点工具法 阀值分割法 二值化 填充分割 自动计数 显示结果 总结 参考资料 本文以钢筋计数为例,讲解一下如何使用ImageJ软件进行计数,这里只介绍两种方法: 多点工具法 阀值分割法 钢筋计数 ...
- 牛客网-SQL专项训练7
①SQL语言可以分为多个类别,那么不属于数据操纵语言DML的是(B) 解析: SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL. 1. 数据查询语 ...
- 力扣693(java)-交替位二进制数(简单)
题目: 给定一个正整数,检查它的二进制表示是否总是 0.1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同. 示例 1: 输入:n = 5输出:true解释:5 的二进制表示是:101示例 ...
- 智能logo免费体验|网站Logo这样设计搜索排名跟着提升
简介:一个好的网站logo,不仅让用户一眼知道网站品牌传递的信息,还能提高网站专业度和丰富度,增加SEO搜索排名.今天分享下如何设计一款实用的网站logo.阿里云智能logo设计,在线免费体验log ...
- [FAQ] Windows 终端 git status 不识别文件名大小写的修改
当我们修改了文件名的大小写,git status 显示没有文件改动. 出现这种情况,首先看一下 git 的配置项是否忽略了文件问大小写: $ git config core.ignorecase ...
- 超级好用的 HBase GUI 工具分享
超级好用的 HBase GUI 工具分享 你是否曾为 HBase 数据管理而苦恼?别担心,这一款超级好用的 HBase GUI (HBase Assistant)工具,让您在大数据世界中游刃有余.不再 ...
- 使用Kafka Assistant监控Kafka关键指标
使用Kafka Assistant监控Kafka关键指标 使用Kafka时,我们比较关心下面这些常见指标. Kafka Assistant下载地址:http://www.redisant.cn/ka ...
- K8s集群中部署SpringCloud在线购物平台(一)
一.安装k8s高可用集群 主机名 IP 配置 网络 master控制节点 192.168.10.10 centos 7.9 4核4G 桥接 node1工作节点 192.168.10.11 centos ...