WIS

发布WIS原理,通过原理能顺利制作出WIS编辑器
WIS文件内部分三部分

文件头,占用200h 固定大小

200h后是图片像素部分这部分长度未知

图片像素后,是每个图片的偏移,占用长度,和一个预留位置

这三个域都是integer型的,占用4个字节

取到偏移列表的方法是

读入文件,跳转到文件全长-12字符处

向下取

第一个4位为最后一个图片的偏移
第二个4位为最后一个图片的占用长度
第三个4位是预留域,暂时无用,值均为0

得到这三个值后,就可以得到整个图片像素区域的长度

像素区域长度是imagecountsize:=最后一个偏移位置+最后一个图片占用长度

从这个imagecountsize后面,就是整个图片偏移列表区域

可以循环读出整个偏移列表(读到文件的EOF)

得到整个偏移列表后

可以看到,图片从200h开始

第一位是一个是否压缩标识
第二到4位,预留位,暂时没有用到
接下去是一个8字节的空间,存放着4个smallint
分别是
Width,Height,X,Y

WIS的像素分压缩,未压缩与捣乱三种情况

压缩情况是

当图片偏移位置开始的第1位为1时,做解压处理

图片偏移开始的第13位不为0时,做解压处理

解压方法是

取13位的值,做为循环次数
取14位的值,做为像素值

例如:13位的值为10
      14位的值为255
那么,WIS的解压过程是

for i:=0 to 9 do
begin
  写入像素(255);
end;

压缩方法就是相邻位值相同则叠加,以减少空间占用。


当图片偏移开始的第1位不为1时,则不做解压处理,而是普通的

Width*Height取值

还有一种是捣乱的情况

当图片偏移位置开始的第1位为1时,而图片偏移位置的第13位为0时,这时就开始捣乱

读入第14位值,做为循环次数

然后依次循环读出14位以后的循环次数的顺序像素写入图片。

界此Wis的文件结构与处理方式已经全面告破。

Chatop 2009-11-24日记录
原文地址:https://www.cnblogs.com/zerovirs/p/1755531.html