关于DNF的多媒体包NPK文件的那些事儿(6) - IMGV4

IMGV4是IMG结构的第四个版本(笔者至今不知道为什么没有IMGV3)。IMGV4采用RGBA索引形式存储数据,广泛用于时装图像的存储,目前国服绝大部分的时装文件均使用IMGV4存储,韩服大部分时装文件则逐渐被IMGV6代替。

IMGV4在文件的前端带有一个调色板信息,存储了IMG内所有图像所使用的颜色的个数以及颜色的RGBA数值,而图像数据则存储索引(即由4字节变为1字节),因此IMGV4相比具有相同效果的IMGV2来说,图像信息存储空间减少了75%,但多了调色板所占用的空间,在时装等这类需要颜色信息较少的IMG文件中,存储空间和读取速度都会变小;对于颜色较为复杂尤其类似于背景这样的点阵图,由于调色板数据较大,因此不适用于IMGV4格式。此外,IMGV4的特点是对颜色进行操作极为容易,对形状操作也较为容易,但是插入具有不同颜色的贴图时需要额外扩充调色板,因此较麻烦。

关于DNF的多媒体包NPK文件的那些事儿(6) - IMGV4

IMGV4的结构如下表所示:

文件头

20字节字符串(注意空格)“Neople Img File”外加“\0”

索引表大小

4字节,索引表所占空间(注意不包含颜色板的空间)。

保留

4字节,为0。

版本号

4字节,IMGV4文件结构中的版本号为4。

索引表数目

4字节,索引表的表项(包括指向型和图片型)

调色板数据

首4字节为调色板所包含的颜色数目,之后的4×颜色数目个字节则为具体数据,详见下文“调色板”。

索引表

索引表项1

由若干个索引项构成。索引项包括2种,指向型和图片型。图片型存储对应图片的各种信息,指向型只存储一个数据,即所指向的图片的帧号。

 

图片型索引项(36字节)

颜色系统

4字节,图像所使用的颜色系统,

IMGV4这里只有一种类型0x0E,表示索引颜色。

压缩状态

4字节,图像所采用的压缩方式,其值含义如下:

0x05(图像数据未压缩)

0x06(图像数据经ZLIB压缩)

图像宽

4字节

图像高

4字节

图像大小

4字节,图像数据所占空间

x坐标

4字节,图像起始绘制点x坐标

y坐标

4字节,图像起始绘制点y坐标

帧域宽

4字节,用途不大,基准用

帧域高

4字节,用途不大,基准用

指向型索引项(2字节)

类型

4字节,固定为0x11。

可以用作区分指向型和图片型数据的标准。

指向帧号

4字节,指向的帧号。

 

 

索引表项2

索引表项3

索引表项4

……

贴图数据

图像数据块1

由首尾相接的图像数据块构成。

由于大部分图像数据由ZLIB进行压缩,因此经常以“0x78 0x9C”数据开头(但不可以其为标准作为图像数据块的起始点),解压后是索引数据,根据索引在调色板中查找对应的颜色。

指向型索引项不对应任何图像数据(即对应的图像数据大小为0)。

图像数据块2

图像数据块3

……

IMGV4的调色板数据使用的ABGR8888方式存储,即在数据流中的顺序为R、G、B、A,这点与IMGV2里的ARGB8888颜色存储方式是有区别的,相当于其中的红蓝通道互换,因此处理V4中的颜色数据时不能沿用IMGV2的处理方式。此外,由于图像数据里一个像素只使用一个字节存储,因此调色板中的颜色数目不能超过256,如果去掉需要表示透明的颜色项(在大部分调色板中位于第一个颜色项即0x00000000)的话,那颜色数目就不能超过255个。

当对应的索引表中的压缩方式为ZLIB压缩时,图像数据使用ZLIB压缩,同V2一样,不在赘述。使用ZLIB解压后得到的数据则是索引数据,像素的颜色可以通过在调色板中进行查找,由于大部分的IMG文件调色板中第一个颜色就是表示透明的像素,因此解压后的图像数据中的00经常表示透明像素了。

IMGV4的颜色调整是极为容易的,只要对IMGV4的调色板数据进行编辑和修改(但不能增加或删除)即可,无需对后续的图像数据进行任何分析;若不改变颜色,对形状修改教IMGV2比也容易,因为无需考虑颜色问题,仅修改索引数据就可以了。

下图是一个比较简单的IMGV4颜色编辑工具:

关于DNF的多媒体包NPK文件的那些事儿(6) - IMGV4


IMGV4最大的问题是插入图片数据,如果插入的图片数据存在IMG文件中调色板所不存在的颜色时,就要扩充颜色板;而此时当颜色板颜色项数已经超过了256,则该IMG文件就无法满足需求了,因此在对IMG进行*的插入和删除时,使用IMGV2更为稳妥。而对于带有渐变或者噪音的图像,使用IMGV4会极大地增加调色板的数据以致性能下降甚至丢失数据,因此也不适合使用IMGV4进行存储。