图像文件格式处理代码

在新浪程序员论坛上碰到有人要 GIF89a 解码的代码,有高手提供了一个 VC 源程序 (在此下载: 30KB), 我也趁机当了一个来,这是一个 ActiveX 控件,使用了多线程,写非常短小,不过源程序的可读性太差。 我在三四年前也曾深入研究过 GIF87a 的格式及 LZW 算法,所以虽然我对 VC 不熟,但在粗略浏览过这些源代码后, 特别是看了其中的 Gif89a.cpp 文件中有关 LZW 解码的部分后,凭我对 GIF 的了解,这个东东写的实在还是不错的! 他用了不同于我以往常见的 LZW 解码代码,程序显得很短,只是不太符合我的编程美学。 另外,遗憾的是这是一个 VC 的程序,而且又是一个 COM 。虽然都是用 ATL ,但用 VC 写的 COM 比 BCB 复杂多了, 看得我眼花缭乱,核心的代码不过 800 多行(gif89a.cpp),但用于 COM 的代码比这还多。 Delphi/C++ Builder 的 VCL 的 Graphics 单元只支持四种 Windows 标准格式:bmp/ico/wmf/emf,在 Delphi 4/C++ Builder 4 后开始支持 JPEG 格式,但还是少,很有必要对 Graphics 单元进行扩充,我决定做这个工作。

说干就干,我翻出那些有的已经发霉的磁盘,找出几年前写的代码, 幸好有个 HD-COPY ,虽是 DOS 程序还是很好用的,那些老代码总算是没丢,本想先写个 GIF 的, 但发现 LZW 算法我已经忘得差不多了,只好先易后难,先写个 PCX 的,毕竟去年我还在用,还是比较熟悉的, 至于 GIF 只好请大家期待了。现在 PCX 部分已经完成,支持单色/16色/256色/24位真彩色格式文件的读写。

全部源程序可以在此下载: 18KB

要说明的是我本来想学 JPEG 那样把 MPcx 单元写成一个 Delphi 单元的, 所以原来 MPcxData 是一个 C 语言的单元,但不知为何我像 JPEG 那样用 External 引用 OBJ 中的外部函数却不行, 只好改作 BCB 版的。另处,本来 TMPCXImage 应该要从 TGraphic 派生出来的,但那样的话我要重写几十个属性/方法/事件, 所以用了一个比较取巧的方法,从 TBitmap 派生出来,只重写了 LoadFromStream 和 SaveToStream 两个虚方法就行了。 还有就是 MPcxData 单元完全与 VCL 无关,即它也可以用于 VC 等其它 C/C++ 编译器。

特别说明:因为我嫌切换输入法太麻烦,所以注释多为英文,但本人的英语水平又不行, 故注释中的错误在所难免,特此说明,还请见谅,多多指教。

补充说明:我终于搞定将 C 语言单元用于 Delphi 中的问题了, 现在的版本同时支持用于 BCB 和 Delphi 中,详见程序的注释。

猛禽 Aug.1-2k, Apr.12-01