手动修改Icon图标的颜色深度

-- 张佩

这本是雕虫小技,但依旧有用,所以写在这里让需要的人看。本文要讲的是怎样手动修改Icon图标的大小和颜色深度。
        问题本身是这样的:我发现在MFC项目中新建图标,它的颜色色度永远都是4bit(即16色),而不是24bit(或0x1000000种颜色)。
解决这个问题最好的办法是使用ICON软件,创建或修改ICON图标。但因为手头没有,并由于研究的兴趣,我选择尝试手动修改Icon文件。在实际操作的过程中,微软文档《Icons in Win32》对我极有帮助。另一篇差不多是它的中文翻译,是《Windows图标-Icon文件格式分析》,也不错。

1. ICON头

和BMP文件相比,ICON文件要再多了一个头。也就是说,如果把一个16*16或32*32这样大小的BMP文件,前置一个Icon头就能变成一个Icon文件了。
        下面是Icon头的结构定义:
typedef struct
{WORD idReserved; // Reserved (must be 0)WORD idType; // Resource Type (1 for icons)WORD idCount; // How many images?ICONDIRENTRY idEntries[1]; // An entry for each image (idCount)
} ICONDIR, *LPICONDIR;

前面是3个word型变量。第一个是保留位(注释指明,一定是0),第二个为类型变量,Icon因设为1,第三个变量是图片数量,一张Icon中可以包含多个BMP图片,对应下面的多个ICONDIRENTRY结构。每个ICONDIRENTRY结构表示一张BMP图,其结构大小是16Byte。所以ICON头的总大小为:6+16×idCount。

下面是ICONDIRENTRY结构定义:
typedef struct
{BYTE bWidth; // Width, in pixels, of the imageBYTE bHeight; // Height, in pixels, of the imageBYTE bColorCount; // Number of colors in image (0 if >=8bpp)BYTE bReserved; // Reserved ( must be 0)WORD wPlanes; // Color PlanesWORD wBitCount; // Bits per pixelDWORD dwBytesInRes; // How many bytes in this resource?DWORD dwImageOffset; // Where in the file is this image?
} ICONDIRENTRY, *LPICONDIRENTRY;

前两个变量指出了图像的大小,由于Icon图片都是长宽相等的,所以一般有16*16,32*32,48*48这几种。

最后一个DWORD变量dwImageOffset,指明对应的BMP文件在整个文件中的偏移。可以用二进制编辑软件打开一个ICON文件后,进行操练。假设某个dwImageOffset值为0X000044E6,移动鼠标到此偏移处,由此开始的一段数据块,就是一个标准的BMP文件了。我们下面就是要通过这种方法,定位BMP文件后,改变BMP文件的颜色等相关属性。

首先确定图像的Index,即它在ICONDIRENTRY列表中的位置,然后找到其BMP文件在ICON文件中的偏移,并定位到此偏移处等待进一步处理。最简单的情况是Icon文件中只有一个Bmp图像,那么Bmp文件的偏移一定总是22。

2. BMP头

现在还需再分析BMP文件。BMP文件由头和体两个部分组成,我们只要分析其头结构即可,下面是结构体BITMAPINFOHEADER的定义:

typedef struct tagBITMAPINFOHEADER { /* bmih */DWORD biSize;LONG biWidth;LONG biHeight;WORD biPlanes;WORD biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;
} BITMAPINFOHEADER;
表示颜色深度的变量biBitCount位于结构体中的第15个字节。它一般有几种取值,即4、8、16、24、32,分别代表了各种不同的颜色深度,见得较多的是4,即共能表示16种颜色。改成24后,能表示的颜色范围变成了16777216(0x1000000)种。
最后两个DWORD型的变量(偏移31字节)能表示的颜色数量,4色对应0x10,即16色。当我们改成24后,应该把它改成0x1000000,即能表示更多的颜色。也可以把其值改成0,0表示颜色数量无限制,相当于最大。

3. 观其效

保存图标文件后重新在VC中打开,到资源里面重新查看Icon属性,是不是已经改变了?现在可以从画板中打开一个图片,挖一块色彩丰富的图片粘帖到Icon中,它的颜色就不会失真了。
        本文介绍的这种方法,可谓九牛拉一草,大力气用在小地方。 但技术爱好者处于研究的目地,这种死功夫又往往是必需的。

手动修改Icon图标的颜色深度(张佩)相关推荐

  1. wifi信息修改插件ios_iOS免越狱修改运营商信息/修改“应用图标标记”颜色

    iOS免越狱修改运营商信息捷径/workflow规则 地址: https://www.icloud.com/shortcuts/cc295815769b44f7a711dab6910e1be8 iOS ...

  2. (css)修改icon图标大小

    (css)修改icon图标大小 style="font-size: 20px; font-weight: bold" <i style="font-size: 20 ...

  3. 如何自己手动修改win10磁贴背景颜色?

    前言 当我们安装完应用后,可以选择将应用图标固定到"开始"屏幕,于是就会产生一个磁贴,有的应用会自带背景颜色,有的则是默认的主题色.其实这个只不过是应用本身没有没有去适配win10 ...

  4. 微信小程序wx.showToast修改icon图标

    wx.showToast({title:"成功",icon: 'success',image: '../../images/fail.png',duration: 2000,mas ...

  5. elementui icon图标使用 颜色修改

    默认是黑色: 通过style属性配置color <i class="el-icon-caret-bottom" style="color: red"/&g ...

  6. 手动修改Spyder的背景颜色(手动配色)

    spyder是一款很不错的python集成开发环境, 但安装之后默认的背景颜色太亮, 很多人都喜欢编写代码时背景为暗色, 这样时间长了眼睛不会太累. spyder中自带了一些暗背景, 在Tools - ...

  7. UITabBar背景、icon图标颜色、被选中背景设置以及隐藏UITabBar的两种方式

    一.对UITabBar背景和icon图标的一些设置 (1)因为直接给UITabBar设置的背景颜色显示的不纯,半透明的感觉,所以,有时候我们可以直接利用纯色的图片作为背景达到想要的效果: (2)给ic ...

  8. 如何获取和制作免费的icon图标素材

    icon 图标在界面设计中虽然占比不大,但却是不可缺少的设计元素之一.设计师通过 icon 图标,将抽象的概念通俗化,降低用户理解某个操作的难度.而设计师也会通过改变 icon 图标的样式来展现整体界 ...

  9. qt修改程序图标名称_解决Qt应用程序添加icon图标,修改窗口图标以及添加系统托盘问题...

    一.Qt应用程序添加icon图标的方法: 首先,我们需要先准备两个文件,一个是icon图标,另一个是rc文件,我分别命名为"myApp.rc"和"soft.ico&quo ...

  10. PS批量快速修改png图标颜色

    PS批量快速修改png图标颜色 一.背景 制作PPT的时候往往需要把图形填充颜色和图标元素的颜色设置成一样,但是往往找到的图标元素的颜色和想要的不一样,因此就需要修改图标颜色.而一个PPT需要的元素比 ...

最新文章

  1. 看完这篇缓存双写分析,你面试不再有问题呢~
  2. java代码实现看帖回帖功能_求助Java窗口菜单如何实现复制粘贴剪切等功能(内附源代码)...
  3. 1.11 抽象(abstract)类
  4. 事务的控制(保存点)
  5. AutoComplete - 自动完成插件
  6. linux 安装python-opencv
  7. vs code python 插件_工具篇-vscode效率提升插件
  8. 依赖管理和Maven
  9. 合泰单片机做电压表_启士 | 蓝桥杯零基础单片机教程9 I2C介绍(上)
  10. Mysql连接错误:Mysql Host is blocked because of many connection errors
  11. 如何查看JVM内存中的对象和执行中的方法
  12. java 存储过程简单例子
  13. Linux虚拟机中vim编辑器常用命令介绍(二)
  14. 一个简单的网页设计HTML5作业
  15. linux触摸屏两指缩放_Linux内核触摸屏驱动--多点触摸 【转】
  16. LUMION PureGlass纯正玻璃材质新功能应用
  17. 未转变者服务器物品ID大全,Unturned未转变者Elver物品代码大全 Elver地图全ID代码汇总...
  18. 本博客通知(亓官劼)
  19. 目标跟踪CLE绘图 OTB数据跟踪绘图 mat文件txt文件 相互转换
  20. 解决:Exception in thread “main“ java.io.IOException: Failed on local exception: com.google.protobuf

热门文章

  1. JVM内存管理--GC算法精解(五分钟教你终极算法---分代搜集算法)
  2. 高通工具QXDM、QCAT和QPST
  3. 使用QXDM Log 來分析LTE環境資訊
  4. xp3+vs2010+opencv2.4.4配置说明
  5. windows中如何显示/隐藏桌面图标
  6. 查看计算机桌面隐藏文件夹,电脑怎么查看隐藏文件(隐藏文件夹显示方法)
  7. 使用wePE安装系统
  8. 即时通讯源码对企业到底有多重要呢?
  9. Chrome浏览器插件之---AdBlock和Adblock Plus
  10. chrome浏览器关闭百度热搜——AdBlock插件