您当前的位置: 首页 > 

龚建波

暂无认证

  • 3浏览

    0关注

    313博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

龚建波 发布时间:2018-07-01 00:21:51 ,浏览量:3

         原本我程序里用的的图标都是网上下载或者在线用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;  // 保留位必须为0
    WORD idType;      // 类型 (1表示icon),也就是必须为1
    WORD idCount;     // 包含多少张图(icon可以含多张图,分别在不同尺寸下展示)
    ICONDIRENTRY idEntries[]; // 对应idCount的结构体,多少张图就有多少个该结构
};

struct ICONDIRENTRY
{
    BYTE bWidth;      // 图片的像素宽度
    BYTE bHeight;     // 图片的像素高度
    BYTE bColorCount; // 颜色深度:=1            
关注
打赏
1655829268
查看更多评论
0.0737s