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 ...
随机推荐
- SSH的密码qsnctfwp
开启 kali,在终端输入ssh root@challenge.qsnctf.com -p [port]可以访问远程 SSH 系统 根据提供的 passlist.txt 文件内容进行密码爆破 编写 S ...
- gitlib配置
第1步:下载Java并安装Java.一般来说下载jdk对应的版本就行. 第2步:配置Java环境变量,具体如下: 1. 新建:变量名:JAVA_HOME:变量值:C:\Program Files\Ja ...
- 【git】ignore文件详解
1.功能 可以指定git,对于某些文件或者文件夹不进行追踪记录,例如一些依赖或者编译中间文件等. 2.使用注意 2.1 对于已经有提交记录的文件 对于已经提交的文件,即使加入了ignore文件也会被g ...
- ArcPy自动绘制大量地图并设置地图要素:Python
本文介绍基于Python语言中ArcPy模块,实现ArcMap自动批量出图,并对地图要素进行自定义批量设置的方法. 1 任务需求 首先,我们来明确一下本文所需实现的需求. 现有通过Pyth ...
- BURP保存多个监听器配置
"感谢您阅读本篇博客!如果您觉得本文对您有所帮助或启发,请不吝点赞和分享给更多的朋友.您的支持是我持续创作的动力,也欢迎留言交流,让我们一起探讨技术,共同成长!谢谢!" 前言 在进 ...
- 第12課-Mirth生产环境宕机后基于服务配置XML备份恢复之记录
Mirth Connect作为集成交换平台,生产环境互联互通了众多系统,脑残的是连自家关键业务系统都依托mirth来进行交互,宕机或故障对身处其中的一次紧张的业务系统升级都造成高度的精神紧张:这种宕机 ...
- 力扣387(java)-字符串中的第一个唯一字符(简单)
题目: 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 .如果不存在,则返回 -1 . 示例 1: 输入: s = "leetcode"输出: 0示例 2: 输 ...
- 基于 Mesh 的统一路由在海外业务的实践
简介:本文主要介绍我们最近在利用 Service Mesh 架构解决海外业务问题中一些实践和价值探索.我们在海外业务引入 Mesh 架构过程中,充分利用 Istio 的基于 yaml 来描述和定义路 ...
- Service Mesh 从“趋势”走向“无聊”
简介: 过去一年,阿里巴巴在 Service Mesh 的探索道路上依旧扎实前行,这种坚定并非只因坚信 Service Mesh 未来一定是云计算基础技术的关键组成部分,还因需要借这一技术趋势去偿还过 ...
- [Caddy2] Caddyfile 概念预览
结构 块: 所有的指令必须在 { } 块中,如果只有一个站点,则块标记可以省略. 全局的配置块可以放在最上方,其次是站点的配置块. 指令: 指令是服务于站点配置的关键词. 关键词和引号: 空格在 Ca ...