由上述程序可以看出,如果能够理清Ps脚本支持对象的 模型结构,机器阅卷还是很轻松的。图2是PS脚本支持对象 中的几个重要对象和属性。 ![]() Ps脚本支持对象提供了十分清晰的对象模型结构,所以 使程序的编制和调试显得相对透明和直观。但缺点也是明显 的,首先它只适合于PS 7.0以I:的版本;其次,各版本所提供 的对象模型结构不尽相同,使脚本阅卷法存在一定的兼容性问 题;还有,阅卷前必须启动Ps程序,等待时间较长,对于配 置较差的机器是个考验;而滤镜效果则只能勉强通过像索色彩 值比较法进行阅卷.效果很不理想。 鉴于脚本阅卷法存在的一些问题。采用PSD文档二进制 数据直接读取法町以解决部分问题。要通过文件的二进制数据 直接获取相关信息.首先要了解文件的数据结构。根据PSD 文档格式说明书的解释。PsD文档总体分为5个数据区.依次 是:文件头(File Header)、色彩模式数据(Color Mode Data)、 图像资源区(Image Resources)、图层和蒙版信息(Layer and Mask Information)和图像数据区(Image Data),它们的数据分 布如图3所示。 ![]() 各数据区的详细数据结构如表l一表5所示。 ![]() 以上5张表格只是PsD文件的总体数据结构.其中各图 层信息和图像数据町参考PsD文档格式说明书。现以检测“C: 、香皂包装盒.psd”图像的宽度和高度为例。说明如何使用-二进 制方式阅卷的方法。 第一步。确定图像宽度和高度值存放地址。根据表l,可 以确定宽度值存放位置始于第15字节,高度值存放位置始于 第19字节,均用4字节存储。PSD文档中整数的存放格式采 用“Little Endian”方式,即高位在前低位在后,根据这个特 点对数据进行转换。转换函数如下: Function get4ByteInteger(fileid As Integer,linkPos As Long)As Long ’fileid为文件号,linkPos为地址指针 Dim al As Byte,a2 As Byte,a3 As Byte,a4 As Byte,sl As Long Get *fileid,linkPos.a 1 Get #fileid,linkPos+1.a2 Get #fileid,linkPos+2,a3 Get #fileid,linkPos+3,a4 sl=a4+a3+256&+a2’256&‘256&+al’256& 。256&。256& getLong=sl End Function 第二步,读取宽高数据: Dim fileid As Integer,linkPos As Long,sign as string fileid=FreeFile() Open“C:\香皂包装盒.psd“For Binary As槲ileid sign=InputS(4,#fileid) if sign=”8BPS”then imageHeight=get4ByteInteger(fileid,1 5) imageWidth=get4ByteInteger(fileid.1 9) Else Msgbox“目标文件不是photoshop源文件,不能阅卷!。 End if Close #fileid 采用PSD文档二进制数据直接读取法。无需安装Ps,无 需启动Ps,也不存在版本问题,兼容性好,阅卷效率很高. 不过调试略显嗣难。可借助winHex等二进制浏览编辑软件辅 助调试程序。但这种方法对滤镜效果也只能采用像素检测法。 |