首页 > 编程语言 >C# 关于图片转ICO的代码整理(无损,不需要第三方类库)

C# 关于图片转ICO的代码整理(无损,不需要第三方类库)

时间:2024-03-25 14:02:30浏览次数:29  
标签:类库 iconWriter ICO C# height Write width new 255

  • 概述(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)

 



标签:类库,iconWriter,ICO,C#,height,Write,width,new,255
From: https://www.cnblogs.com/tpen/p/18094182

相关文章

  • 最全面的C语言的运算符优先级
    C语言是一种广泛应用于系统编程和应用程序开发的高级编程语言。在C语言中,运算符优先级是非常重要的概念,它决定了表达式中各个运算符的执行顺序。本文将详细介绍C语言中各种运算符的优先级,帮助读者更好地理解和使用这些运算符。首先,我们需要了解C语言中运算符的分类。C语言......
  • [ARC172A] Chocolate
    原题链接题解考虑以下决策,绝对最优:1.按巧克力块的大小排序,先把大的块分出来。2.一开始完整的巧克力是块矩形,取出一个正方形后,可以分为下方和右侧两个矩形,然后把这两个矩形放入优先队列。3.分割下一个矩形时,从队列中取出最短边最长的那个矩形,在这个矩形上做步骤2一样的分割......
  • 【python】flask执行上下文context,请求上下文和应用上下文原理解析
    ✨✨欢迎大家来到景天科技苑✨✨......
  • DHCP VRRP
    一、DHCP1.1定义:用于自动获取ip地址1.2工作原理:客户端会发送一个广播DHCPdiscover报文去寻找DHCP服务器;客户端只会接收第一个的回复的DHCP服务器的报文;服务端会发送一个DHCPoffer报文报文中携带相关配置信息(ip地址子网掩码网关等);报文客户端收到这个offer报文后会......
  • 瀚高数据库 select-sql常用函数
    瀚高数据库select-sql常用函数1、字符串拼接||语法string||string示例'post'||'gresql'--返回postgresql2、字符串的长度length()语法length(string)示例length('odoo')--返回43、模式匹配like语法stringlikepattern示例’abc’like’abc’--返回true’abc’li......
  • 互联网编程必读-有效的现代C++
    本书介绍    掌握C++11和C++14不仅仅是熟悉它们引入的特性(例如,自动类型声明、移动语义、lambda表达式和并发支持)。挑战在于学会有效地使用这些特性—这样你的软件才是正确的、高效的、可维护的和可移植的。这就是这本实用书的用武之地。它描述了如何使用C++11和C++14......
  • C语言(结构体,联合体,枚举的讲解)
    这期我们来讲解结构体,联合体,以及枚举的讲解,首先我们从概念开始一步一步的了解。1,结构体1.1概念C语言中的结构体是一种用户自定义的数据类型,它允许你将不同类型的变量组合在一起,从而形成一个新的数据类型。结构体在C语言中非常有用,可以用于表示复杂的数据结构,比如学生信息......
  • Surface salinity 提取流程-以西安市隋大兴唐长安城遗址为例
    写在前面:   Surfacesalinity(地表盐度)是对Landsat8数据所进行的反演处理;鉴于考虑到高浓、高盐环境会提高土壤溶液的渗透压,从而引起地表植物生理性干旱,严重时可导致水分从植物根细胞外渗直接导致死亡,而植物死亡后的根系腐化会对夯土遗址造成不可逆的生物性破坏。其实本......
  • 基于 “CRITICAL_SECTION“ 的同步方法
    CRITICAL_SECTION 在Windows操作系统中通常用于同步多个线程,确保一次只有一个线程可以访问特定的代码段或资源。这对于防止数据竞争和不一致至关重要。以下是使用 CRITICAL_SECTION 的基本步骤:声明和初始化:首先,你需要声明一个 CRITICAL_SECTION 类型的变量。然后,使用......
  • typedef struct 和struct
    1.typedefstruct:structBooks{  char title[50];  char author[50];  char subject[100];  int book_id;}book;例如:typedefstruct{chartitle[50];charauthor[50];intbook_id;}Books;BooksmyBook;2.struct:structtag......