[发布] 用于读写ICO图标文件的 Photoshop 插件

  1. 云栖社区>
  2. 博客>
  3. 正文

[发布] 用于读写ICO图标文件的 Photoshop 插件

hoodlum1980 2010-12-16 08:26:00 浏览1023
展开阅读全文

    这是我为 Photoshop 编写的一个文件格式插件,IcoFormat,用于读写 Windows 图标文件(扩展名为ICO, CUR)。图标文件格式的PS插件在很多年前有一个老外曾经写过,不过我现在提供的插件则功能上更好,有足够的理由替换掉老外提供的插件。

    老外的插件的特点我记得不是很清楚了,大概根据记忆对比如下:

    (1)老外的插件在文件对话框中选择该插件时,无法显示 ICO 文件。可能是因为他的 PiPL 资源写的有问题。我的插件没有该问题。

    (2)老外的插件在打开含有多个图像的文件时,无法预览,而我提供了对话框上的预览图,对用户更友好。

    (3)老外的插件对图标的透明部分不能很好处理(记忆中),而用我的插件,你可以很好的设置透明部分。

    (4)老外的插件不能保存XP系统的多图像的反锯齿图标,而我的插件能保存为反锯齿图标,并且自动生成其他质量和标准大小的图像 (这一点我认为是最重要的替换老外的插件的理由)。

    (5)图像降级时采用了八叉树算法,降级后的图像质量要比例如IconWorkshop之类的软件采用的方法更好。

    (6)我的插件是 scripting-aware 的(即插件参数会存放在PS脚本系统中),在运行时可以记住用户的设定。

    (7)我的插件可以打开和保存光标(CUR)文件,老外的插件貌似不能。并且我可能还会后续继续开发从PE文件导入图标等其他功能。

    下面主要是对这个插件一些简单的说明和介绍。这个插件一共有4个对话框,分别是关于对话框,图像选取对话框(打开文件时),透明部分设置对话框,图像保存选项设置对话框。下面我将一一展示一下。

 

    (1)图像选择对话框

 

    当打开含有多个图像的图标时,会弹出图像选择对话框:

    

    在这里主要是要求用户从文件中选择一个要打开的图像,“添加AND MASK或Alhpa为独立通道”是指,如果是32 BPP 以下的图标,会把 AND MASK (黑白两色位图,白色表示透明)添加到PS中的新建通道,如果是32 BPP 图标,会把 Alpha 通道添加为 PS 中新建通道。“是否显示棋盘网格”是针对对话框上的图像预览图而言的,如果勾选,实际上是调用了 PS 中的回调函数进行绘制的,否则是通过 WIN32 的 GDI 函数绘制的。 

 

    (2)图像质量选择对话框

 

    当保存文件时,根据图像模式的不同弹出不同对话框。如果当前的图像模式是RGB模式,则会弹出下面的对话框,要求用户设置要保存为什么质量的图标。如果你选择的是反锯齿图标,我会自动的为文件中增加其他大小和颜色质量的图像(最后文件中可能含有 3 到 12 个图像,具体个数将依据文件尺寸和标准图像尺寸之间的关系决定),此插件生成的反锯齿图标完全是参考 MSDN 对 XP 系统使用的图标的要求而生成的,所以此插件生成的反锯齿图标可以直接导入到 VS 的 Windows 应用程序项目中进行使用。关于反锯齿图标,可以参考我之前的文章。

    

    下面的拉伸模式选项,仅针对 32BPP 反锯齿图标时有效,因为在这里只有 32 BPP 涉及到需要把图像缩小。所谓删除像素是指像素重叠时,只会取图像上的某一个像素。线性插值是指在源图上的某4个像素中取一个线性插值。从原则上讲,删除像素比线性插值的运算量小,而线性插值的缩放质量可能更好一点,但是实际上很难感受到太大差别。

    如果选择的是 16 BPP,则保存的图像是 X-5-5-5 分布的图像。选择 4 BPP 或 8 BPP 图像时采用的图像降级算法是八叉树算法(我在前一篇文章中曾经介绍过)。由于八叉树算法在颜色数量很少时可能会使图像突变成全部同一个颜色,所以我没有提供保存为单色图像的选项(最低BPP是4)。下图显示了把一个图标降级保存后的图像质量效果:

    

    通过这个插件你可以很容易把PNG图片,转换成反锯齿图标。方法是:在PS中打开PNG图片,然后再另存为 ICO 文件即可。

 

    (3)AND MASK设置对话框

 

    保存文件时,如果图像是索引模式,则要求用户设置透明部分(AND MASK部分)。默认选项是直接使用 PS 文档本身的透明信息,但这个对话框也允许你选择其他方式去设置透明信息。

    

    这里有很多设置,你可以用下拉框切换,则下方可能会提供不同的输入界面。你可以设置透明色为黑色,白色,前景,背景,某个采样点的颜色,某个指定RGB颜色,或者alpha通道(白色表示透明),或者指定一个颜色表中的索引。

 

    (4)关于对话框

 

    你可以在PS的菜单:帮助-关于增效工具-ICO...中看到它,这个对话框也是我精心设计和编写的,还是蛮漂亮的。当你在这个对话框中移动鼠标时,能看到我的博客网址对鼠标的反馈,你可以在网址上面点击,即调用默认浏览器打开网址。这是通过PS提供的 CallBack Suite 实现的,我在之前写的如何编写 PS 滤镜的教程中曾经介绍过。

    

 

    (5)其他说明:

 

    该插件是建立在我最近的一些已发表的博客的研究基础上的,从图像文件格式查看器开始,到AlphaBlend和反锯齿图标,生成索引图像的八叉树算法,这些文章发表的目的都是为本插件做的技术准备。要开发这个插件,需要耗费很大精力,包括研究 ICO 文件格式,PS SDK 等等。已参考的资料(例如八叉树算法)在之前的博文中已有介绍,在此省略。

    5.1 如果文件中没有指定 X,Y 分辨率,则我会在 PS 中保持 PS 的默认值:72像素/英寸。

    5.2 如果打开了索引图像,你可以在菜单:图像-模式-颜色表 中看到当前的颜色表。由于有些软件(例如AcdSee)不能正确解析颜色表为实际颜色数量的图像,所以我保存文件时,颜色表一律设置为 16 或者 256,而不是实际的颜色个数。

    5.3 本插件尤其适用于以下用户,我会向下列人群强烈推荐你安装这个插件:

    PS熟练用户,Windows 图标设计师, 喜欢自己参与 UI 设计的程序员,工程师等技术人员(就像我这样的人)。

    这个插件使用户可以完全利用到 Photoshop 的强大图像处理能力,而不再受限制于 VC,VS.NET 等IDE的有限编辑能力,这样你就能借助 Photoshop 制作出更漂亮的图标,当然你也可以很方便的把网络上很多 PNG 素材方便的转换成在程序中使用的图标。 

    我衷心的希望有更多的人喜欢它,使用它。如果你有任何的使用意见和建议和需求,欢迎你在我的博客留言,或者发送 Email 到我的信箱(信箱地址位于左侧的公告栏)。

 

    (6)最后是该插件的发行包的下载连接:

 

    (还包含 2.0 版本 ICO 插件和安装工具,油画滤镜,DrawTable 滤镜): 

    http://files.cnblogs.com/hoodlum1980/PsPlugIns_V2013.zip

     备注:如果此处链接失效,请参考另一篇文章(发布2.0版本)中的链接。

 

    (7)安装方法:

 

    把 “IcoFormat.8BI” 文件复制到Photoshop的文件格式插件目录 ①,例如 C:\Program Files\Adobe\Photoshop CS\增效工具\文件格式\,重启 PS 即可。检查在PS的菜单中如果有下面的菜单:“帮助-关于增效工具-ICO...”,则说明插件安装成功。

    

    (8)更新记录 (BUG等级:H: 极其重要; M: 中等; L: 无关紧要) :

 

    8.1 M: 保存为32BPP以下质量时,调整了设置ANDMASK的逻辑(Alpha通道中所有小于255的都被设置为透明),已避免显示出比较生硬的阴影。2010-12-17。

    8.2 H: 修正在保存32BPP反锯齿图标,选择线性插值时,错误的将Alpha通道也使用线性插值的BUG(正确的做法是 Alpha 通道依然用删除像素方法生成)。该BUG导致在产生其他大小的图像时,可能会错误的使不应该透明的像素成为透明。值得一提的是,此 BUG 是由 8.1 引入的。2010-12-18 2:04:15。

    8.3 L: 修正以下BUG,打开图标中的索引图像,取消勾选“开启图像透明效果”选项,但结果有时仍然应用了透明。2010-12-18 3:36:08。

    8.4 H: 调整了插件的 PIPL 资源,使滤镜可以直接从 PS 中获取到文档的透明信息(不再需要用户显式提供附加通道了)。调整了线性插值的代码中逻辑不够准确的部分,并避免像素与源图上的透明部分(黑色)合成。2010-12-19 0:55:23。

    8.5 M: 调整了生成 32 BPP 图标的逻辑,直接从 PS 文档中的数据去降级图像 (原方式在产生索引图像时偶发颜色缺失,原因不详)。2010-12-19 1:41:08。

    8.6 L: 增加存储为 32 BPP 单个图像的反锯齿图标选项。2010-12-22 2:05:30。

    8.7 L: 读取索引图像时,设置透明的方法重新改为之前的方法。可以保证应用透明更加准确,对于16色图像一定会正确应用透明,对256色图像尝试寻找把图像上没有使用的颜色作为透明色,因此有可能无法应用透明。该方法主要缺点是,另存为时,可能使16色索引图像升级成256色图像。2010-12-23 2:57:17。

    8.8 L: 细微调整了读取 16 BPP 图像的像素取值的线性映射方法(影响不大)。2010-12-24 18:48。

 

    (9)致谢:

 

     感谢 Chris Cox (Adobe 员工)在官方论坛上对我提的问题给予答复。

    Adoble 论坛的 Photoshop SDK 版块网址:

    http://forums.adobe.com/community/photoshop/photoshop_sdk

 

    (10)参考资料:

 

    10.1 八叉树算法(地址略)。

    10.2 Photoshop SDK(6.0, CS)。

    10.3 ICONPRO(MSDN 技术文档中提供的范例)。

 

    (11)本文中使用的术语介绍

 

    11.1 BPP(Bits Per Pixel)

    即图像的位深度。其含义是描述每个像素所使用的位数(一个字节含有8位)。例如对于 RGB 真彩色位图来说,每个像素用三个字节表示,其BPP = 24。黑白图像(二元位图)的位深度为1。16色索引图像的位深度为4(每个字节可表示两个像素),256色索引图像的位深度为8(每个字节表示一个像素)。通常位深度除以8,就是表示每个像素的字节个数。

    我们常说的灰度图像实际上并不是一种专有格式,而是一种特殊的256色索引图像,其调色板的特征是每个颜色的R,G,B三个分量是相等的,256个调色板颜色从(0,0,0)到(255,255,255),因此其图像数据的值本质上依然是颜色索引,但同时也可以理解为其灰度的亮度。

 

    11.2 反锯齿(AntiAlias)

    这里是我个人的译法,可能不够准确,可能应该称为抗锯齿才更符合更多人的习惯。这是一种使用半透明像素的技术,用于消除锯齿感。首先我们需要了解的是锯齿感其产生的原因是显示器呈现图像使用的是一个密集的矩阵栅格,GDI按照计算机图像算法设置点阵像素(本质上把数学的模拟信号变成离散化后的数字化信号),这种呈现类型的直线看上去带有锯齿,有点像楼梯。相邻像素的非平滑性突变使人产生锯齿观感。

    更为复杂的呈现直线的技术需要使用部分透明的像素和不透明的像素。像素被设为纯色或与背景色的混合色(取决于它们和直线的接近程度)。这种呈现方式被称为消除锯齿,它可以生成视觉上更感平滑,柔和的直线。

    本文中提到的反锯齿图标,指的是 32 BPP 的图像。即每个像素用4个字节表示,分别代表的是R,G,B,A(lpha),比普通RGB位图多出来的一个 Alpha 通道,用于描述该像素的透明程度。因此能够指定像素的半透明,从而和背景产生柔和的融合,即达到反锯齿的效果。

    


    ① PS 插件目录通常是指 $(PS INSTALL DIR) \ Plug-Ins,只要把第三方插件的文件(.8B*)放在这个目录下,PS在启动时就会去扫描并尝试加载这个目录下的 8B* 文件。插件是什么种类,并不是由后缀名决定的,而是由其PIPL属性指定的。在这个目录下,又可以按照插件种类建立相应的子目录。例如滤镜(Filter),文件格式(File Format),但注意只要把文件放到PS的插件目录即可被PS尝试加载。 插件目录可以通过查找注册表的下列位置得到:

    HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Photoshop\(版本号,例如8.0)\PluginPath

    但是对于 PS CS 中文版来说,这个值保持着英文版路径(没有被汉化),所以是错误的,所以这给我们为插件提供一个更简单易用的安装工具造成了一点小障碍。对于英文版来说,可以认为就是PS安装目录下面的 Plug-Ins 子目录。

网友评论

登录后评论
0/500
评论