现在很少有人不在乎额外的一两个字节。 但是也有这样的人,而这篇笔记正是为这样一个
书呆子而写的。 )
在那些孤立的情况下,当我需要记录应用程序的表情图标(.ico)并同时必须保存字节时,我使用了以下技巧:我以16色模式记录了图像-但是! -不是在通常的固定调色板中,而是在自适应调色板中。
它有什么作用? 图标48x48、1位透明,256色= 3774字节,也为16色= 1662字节。 增益为2 KB,图像质量略有下降。

一个例子。 从左到右:
- 256色原件
- 固定的标准16色调色板(在这里我花了几分钟的时间才能使图像至少看起来像样)
- 自适应16色调色板+阴影(抖动)。
如何运作? 奇怪的是,16色图标始终带有调色板。 也就是说,99.9%的旧图标带有完全相同的64字节颜色表(每种颜色4字节)。 而且,是的-事实证明它可以重新编程。
不幸的是,我不熟悉该程序,该程序可以完全使用此类图标。 因此,这是制作劣质图标的方法:采用IrfanView,将图片上传到其中:预先准备的16色,或减少其中的颜色数量:菜单-图像-减少色深...-16色。 现在:菜单-另存为...-选择.ico格式。 这就是全部吗? 不,不是全部:Irfan View不知道如何使用透明度;必须在另一个程序中手动将其还原。 Microangelo Studio可以加载和编辑此类图标(哎呀,它不允许从头开始创建此类库,就像从头开始创建此类图标一样)。 我们将图标加载到Microangelo中,并且……也许,在移动过程中,我们会收到一个有关“错误调色板”的警告窗口-这在实践中将在后面描述。 使用“填充”和“铅笔”工具,标记透明区域; 写下 完成了!
大约十年前,我就是这样做的。 现在,在仔细观察Microangelo调色板后,我有疑问。 什么是18种颜色的奇怪调色板? 如何在文件中存储18种颜色? 人数不圆,先生们,程序员不要这样做; 对他们来说不方便 ))可以看出,在调色板中有16种纯色和2种服务色:“透明”和“反色”。 什么样的“逆”? -如果出现这种颜色,它将显示底色的负值; 它最常用于游标; 本质上和文件结构中的光标也是一个图标。 但是如何存储所有这些颜色? 如果将普通图像点打包为4位(16种颜色),则透明度只能存储为单独的位掩码(每个图像点1位)。 好的,那么反转存储在哪里? 另一个口罩,还是什么? 不经济,但是可能...让我们数。
图标48x48,16种颜色,1张图片。 文件大小为1662字节。 里面有什么? 我微不足道地想出这些细微之处,但请尝试解决。 主要部分是图像本身:48 * 48/2 = 1152字节。 调色板:16 * 4 = 64字节。 透明掩码为48 * 48/8 = 288个字节。 标头.ico,正式= 6个字节。 框架描述(1个)。来自文档= 16字节。 总计:1152 + 64 + 288 + 6 + 16 =1526。可能还有其他原因,因为实际文件的大小更大-但这并不重要; 另一件事很重要,“不一致”的其余部分很小:136个字节,并且显然不允许放置另一个大小为288字节的位掩码。 因此...反色以某种方式嵌入到图片本身中。 也许现在您可以自己猜测他们是如何做到的?
显然,他们是这样做的:在原始Windows中(完全从Win 95OSR2开始,在Win XP和更新的Windows XP中已经部分启动),严格来说,图标和光标中没有真正的透明颜色。 如果显示了Alpha蒙版:当前光标/图标的点是“透明的”-光标/图标下的颜色已被取和并进行异或(“排他”或“”;也许只是减法)-注意! -当前点颜色取自图标调色板。
怎么了 如果是第一种颜色(固定调色板中为黑色),则XOR不会对背景进行“任何操作”-该颜色变为透明。 如果它是最后一种颜色(在固定的调色板中为白色),则该颜色完全改变,变为负色。 这是“ 18种颜色”如何存储的全部秘密……也就是说,再次是:“透明” =黑色(+)alpha蒙版,“反色” =白色(+)alpha蒙版。 现在-让我们谈谈故障。
Microangelo在上面提到的警告指出:“您的调色板中没有完整的白色和黑色,使用透明性将是不正确的!” 确实,我们的自适应调色板很可能没有黑色或白色。 那么透明度将如何计算? 哦,正好符合我们的期望:它将从调色板中获取某种颜色(例如,绿色),并与背景进行“异或”,我们将获得漂亮的紫色而不是透明色。 )或另一个例子-黑色意外掉入了调色板中最后一种颜色的位置:“反转”变成了通常的完全透明。
示例:左边是标准调色板,右边是重新编程的。 左侧是透明度(P)和反转(I),它们应按需进行计算; 在右边-显然不是。但是,我们只能在原始Windows中观察到图标的所有这些魅力。 诸如Win 10之类的现代操作系统会忽略调色板的颜色,“透明”位掩码始终像透明形式一样以其最纯净的形式工作:既没有XOR,也没有反转。 但是,在游标显示机制中,仍然存在兼容性-一个成熟的,经济的,成熟的电路在那里工作; “温暖,灯火”和……很少有人了解和需要。
示例:Windows XP和Windows 7中相同图标的不同显示。