Icon图标格式(用于生成*.ico图标)

article/2025/10/9 18:32:02

         原本我程序里用的的图标都是网上下载或者在线用png转成ico,但是之前那个公司不能上外网,而ps和fw都不能直接生成ico格式(ps可以找转ico的插件)。后来,网上找了个C#图片转ico的例子,借助的Icon类,但是生成的图效果不太好,透明图部分会有黑线(预览)。于是乎就折腾了半天ico格式的协议,主要参考的是https://www.cnblogs.com/cswuyg/p/3603707.html以及他的相关参考,还有http://lqzit.iteye.com/blog/1033407。除了掩码没搞明白,其他基本都清楚了,然后根据在线转换网站生成的格式来作为参照,完成了生成ico的功能。(其实可以直接参照开源软件ImageMagick的代码,在源码包的coders文件夹里有各种图的格式,我也是后来才知道,ImageMagick中文网:http://www.imagemagick.com.cn/download.html) 

       如果要了解icon相关的协议,可以百度或者看我最上面那个链接,这里我只写下我的实现。生成的是32色RGBA的ico图,在xp/win7/win10下显示正常,预览没有发现有黑线。

        首先,ico结构=Icon格式头+位图格式头+位图数据(数据行是反过来的,第一行在最后)+位图掩码部分。

(代码中Byte一个字节,Word两个字节,Long和DWord四个字节,小端模式--即低位在前)

第一部分:Icon格式头(22Byte

struct IconHeader
{WORD idReserved;  // 保留位必须为0WORD idType;      // 类型 (1表示icon),也就是必须为1WORD idCount;     // 包含多少张图(icon可以含多张图,分别在不同尺寸下展示)ICONDIRENTRY idEntries[]; // 对应idCount的结构体,多少张图就有多少个该结构
};struct ICONDIRENTRY
{BYTE bWidth;      // 图片的像素宽度BYTE bHeight;     // 图片的像素高度BYTE bColorCount; // 颜色深度:=1<<(wBitCount×wPlanes),如果大于等于8就为0;但是可以不管,填0就行BYTE bReserved;   // 保留位必须为零WORD wPlanes;     // Color Planes,我填的1WORD wBitCount;   // Bits per pixel,我填的32DWORD dwBytesInRes;  //该图字节数(位图头+image数据+掩码的字节总数)DWORD dwImageOffset; //相对于文件开始处的偏移量,单个图填22,毕竟icon头加起来22字节
};

通过BeyondCompare软件查看得到的icon头hex数据是这样的(64*64像素)

第二部分:位图格式

struct BitmapHeader
{BITMAPINFOHEADER icHeader; // DIB headerRGBQUAD icColors[]; // 颜色表,24/32色不用颜色表BYTE icXOR[]; // DIB bits for XOR maskBYTE icAND[]; // DIB bits for AND mask 这两个单色的时候位置相反
};struct bitmapHeader
{DWORD  biSize;//结构长度,40ByteLONG   biWidth; //图宽度LONG   biHeight;//图高度(xor+and的)也就是两倍高度WORD   biPlanes;//我填的1WORD   biBitCount;//我填的32DWORD   biCompression;//压缩方式,填的0DWORD   biSizeImage;//图大小,仅rgba部分LONG    biXPelsPerMeter;//(后面四个貌似不用管,是属于bmp的格式),X方向分辨率LONG    biYPelsPerMeter;//Y方向分辨率DWORD  biClrUsed;//颜色数,可以填0默认DWORD  biClrImportant;//重要颜色数,填0表示全是重要
}; 

通过BeyondCompare软件查看得到的位图头hex数据是这样的

虽然后两个字节数组xor和and没搞懂协议怎么算的,但是我根据网站生成的格式倒推出,icHeader位图格式头为40Byte;icColors我用的32色所以没有该部分;icXor填图片原始数据,并且行数是倒过来的,第一行是原图的最后一行,以此类推,且每个像素先后填入颜色B.G.R.A部分值,共width×height×4  Byte;icAnd部分,对应不透明度,如果是透明就为1,半透明和不透明都是0(相当于1个bit对应于一个像素点,行数同height,宽度若原为16/32则为掩码占的宽度为4Byte,若原为48/64则为8Byte,若原为128则为16Byte,并且16和48时有效位填不满,空出来的是每行后部分字节填0(自行脑补二维数组,行数相等,arr[0][0]有效arr[0][n-1]为0)),掩码部分占了width×掩码宽度 Byte。(之前16/48无效部分我填的零,但是后来看网站生成的好像填的1)

这样,假如是64*64的ico图标,应该占16958字节,22+40+16384+512.

知道了格式就容易把图片转为ico图标了,获取rgab值然后填充字节数组就行了。  


http://chatgpt.dhexx.cn/article/ipu9pVDv.shtml

相关文章

网站favion.ico图标

Favicon.ico一般用于作为缩略的网站标志&#xff0c;它显示在浏览器的地址栏或者标签上。 目前主要的浏览器都支持favicon.ico图标 一 制作favicon图标 1 把品优购图标切成png图片 2 把png图片转换为ico图标&#xff0c;这需要借助第三方转换网站&#xff0c;例如&#xff1…

icon图标

最近公司要求项目可配置主题颜色&#xff0c;包括一些小图片也要改变颜色&#xff0c;&#xff0c;所以用icon图标是最好的了 iconfont-阿里巴巴矢量图标库这里可以找到很多图片资源&#xff0c;右上角搜索你想要的图片的关键词&#xff0c;就会有很多图片供你选择 如果我们只…

Linux命令之iconv命令

一、命令简介 日常工作中我们需要将windows生成的文件上传到Linux系统&#xff0c;有时候会因为编码问题出现显示乱码。例如我上传了一个csv文件到Linux服务器上&#xff0c;默认编码为GB2312&#xff0c;在Linux打开则会出现乱码&#xff0c;我们需要将文件进行编码转换。icon…

aardio Html解析库 htmlParser (三) 节点属性获取

当我们找到了节点后&#xff0c;就可以根据属性来查找节点内不同的值。 1. 可以根据节点直接获取的属性值 2. 节点提供了一个方法来取标签内的属性值 3. 节点的所有属性存在放在Attributes集合对象中&#xff0c;所以也可以直接使用它获取标签属性 4. Attributes.Count 包含标…

HttpClient 与 HtmlParser 简介

HttpClient 与 HtmlParser 简介 本小结简单的介绍一下 HttpClinet 和 HtmlParser 两个开源的项目&#xff0c;以及他们的网站和提供下载的地址。 http://blog.csdn.net/dancen/article/details/7570911 HttpClient 简介 HTTP 协议是现在的因特网最重要的协议之一。除了 WEB 浏…

HTMLParser获取属性名

HTMLParser获取属性名方式&#xff1a; 原始网页文本&#xff1a; 1 <a title"美军被曝虐尸" href"http://www.sogou.com/web?query%C3%C0%BE%FC%B1%BB%C6%D8%C5%B0%CA%AC" target"_blank">美军被曝虐尸</a></li><li>&…

HTMLParser解析html详解

HTMLParser具有小巧&#xff0c;快速的优点&#xff0c;缺点是相关文档比较少&#xff08;英文的也少&#xff09;&#xff0c;很多功能需要自己摸索。对于初学者还是要费一些功夫的&#xff0c;而一旦上手以后&#xff0c;会发现HTMLParser的结构设计很巧妙&#xff0c;非常实…

HtmlParser使用指南

1、相关资料 官方文档&#xff1a;http://htmlparser.sourceforge.NET/samples.html API&#xff1a;http://htmlparser.sourceforge.Net/javadoc/index.html 其它HTML 解释器&#xff1a;jsoup等。由于HtmlParser自2006年以后就再没更新&#xff0c;目前很多人推荐使用jsoup代…

htmlparser的使用java_java htmlparser 简单使用入门

下面对htmlparser 简单介绍下,信息来自百度 htmlparser [1] 是一个纯的 java写的 html( 标准通用标记语言下的一个应用)解析的库&#xff0c;它不依赖于其它的java库文件&#xff0c;主要用于改造或 提取html。它能超高速解析html&#xff0c;而且不会出错。现在htmlparser最新…

java htmlparser 使用教程_HtmlParser基础教程

1、相关资料 官方文档&#xff1a;http://htmlparser.sourceforge.net/samples.html API&#xff1a;http://htmlparser.sourceforge.net/javadoc/index.html 其它HTML 解释器&#xff1a;jsoup等。由于HtmlParser自2006年以后就再没更新&#xff0c;目前很多人推荐使用jsoup代…

htmlparser补全HTML,htmlparser

源程序代码 我们的 C# 程序中经常会产生一些数据&#xff0c;这些数据可以使用 Html 表格进行展现。现在让我们开始写相关的 C# 程序吧。下面就是 HtmlMaker.cs&#xff1a;01:usingSystem;02:usingSystem.IO;03:usingSystem.Net;04:usingSystem.Data;05:usingSystem.Drawing;0…

【大数据】——Mahout(Hadoop体系的机器学习)

一、前言 Mahout 是Apache的一个开源项目&#xff0c;提供一些可扩展的机器学习领域经典算法的实现&#xff0c;旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout包含许多实现&#xff0c;包括聚类、分类、推荐过滤、频繁子项挖掘。此外&#xff0c;通过使用 Apache Ha…

mahout连接mysql时无法推荐_Mahout推荐系统初试

Mahout是Apache Software Foundation(ASF)旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘。此外,通过使用Apache Hadoop库,Mahout可以有效…

mahout 0.9 连接mysql_部署安装 Mahout

一、Mahout简介 Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目&#xff0c;提供一些可扩展的机器学习领域经典算法的实现&#xff0c;旨在帮助开发人员更加方便快捷地创建智能应用程序。Apache Mahout项目已经发展到了它的第三个年头&#xff0c;目前已经有了…

mahout 推荐算法 java_推荐系统之推荐算法实战:mahout推荐算法框架

1.Mahout介绍 1.1概述 根据百度的解说&#xff0c;Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目&#xff0c;提供一些可扩展的机器学习领域经典算法的实现&#xff0c;旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout包含许多实现&#xff0c;包括聚…

Mahout之——Mahout推荐算法API详解

前言 用Mahout来构建推荐系统&#xff0c;是一件既简单又困难的事情。简单是因为Mahout完整地封装了“协同过滤”算法&#xff0c;并实现了并行化&#xff0c;提供非常简单的API接口&#xff1b;困难是因为我们不了解算法细节&#xff0c;很难去根据业务的场景进行算法配置和调…

mahout 记录

mahout 记录 mahout记录 输入 mahout 是以偏好&#xff08;preference&#xff09;的形式来表达的&#xff0c;一个偏好包含一个用户ID、一个物品ID、还有一个用户对物品偏爱程度的数值 简单示意图&#xff1a; DataModel 实现存储并为计算提供其所需的所有偏好、用户和物品…

Apache Mahout初体验

1、Mahout是什么&#xff1f; Mahout是一个算法库,集成了很多算法。 Apache Mahout 是 Apache Software Foundation&#xff08;ASF&#xff09;旗下的一个开源项目&#xff0c;提供一些可扩展的机器学习领域经典算法的实现&#xff0c;旨在帮助开发人员更加方便快捷地创建智能…

java调用集群mahout_Mahout--用Maven构建Mahout项目(mahoutDemo)

前言 基于Hadoop的项目,不管是MapReduce开发,还是Mahout的开发都是在一个复杂的编程环境中开发。Java的环境问题,是困扰着每个程序员的噩梦。Java程序员,不仅要会写Java程序,还要会调linux,会配hadoop,启动hadoop,还要会自己运维。所以,新手想玩起Hadoop真不是件简单的…

使用Mahout搭建推荐系统之入门篇-Mahout实战

原始地址&#xff1a;http://my.oschina.net/Cfreedom/blog/201828 用意&#xff1a; 结合上篇博客&#xff0c;写写代码熟悉一下Mahout。很多地方想法都比较粗糙&#xff0c;亟待指正。 代码放在了&#xff1a; https://github.com/xiaoqiangkx/qingRS 一、基本内容 1. 加载…