IMGV5是IMG结构的第五个版本。在所有IMG版本中,IMGV5是最另类的,与其他版本不同,IMGV5采用DDS方案而非像素点阵方式存储数据。DDS是纹理压缩图像文件,广泛应用于模型设计,系统可以通过Direct3D直接读取这些文件,并且内存消耗比其他的图像文件小。IMGV5普遍被各种人物、怪物技能特效所采用,某些物品贴图也使用IMGV5存储。

IMGV5包含两个表,其中一个表包含了DDS图片的信息,称为DDS索引项,另一个则是与其他IMG版本一样作用的普通索引项,尽管IMGV5所使用的索引项占据空间更大。

IMGV5内的图像数据文件数目等于DDS索引项数,而并非等于普通索引项数,其中每个图像数据均由一个完整的DDS文件经过ZLIB压缩后获得。解压后的DDS文件无需任何辅助可以直接通过转换算法转化为一个点阵图像(因为这个DDS文件内部也有自己的结构,不像点阵图像只存储点阵,尺寸和颜色信息依然需要IMG的索引项给出),DDS索引项的用途无非就是定位压缩前的图像数据在IMG文件的位置而已,仅起到便利性而非决定性作用。而普通索引项包含的信息除了其他IMG所应有的信息(图像长度并不包含因为已经不需要了)之外,还包含了引用DDS的序号以及两个坐标点;这是由于DDS图像解出来后一般是个大图像(如下图所示),而真正的贴图帧根据DDS的序号确定使用哪个DDS图像,并通过两个坐标点来确定该贴图属于这个大的DDS图像中的哪个区域。这样,根据对大图像的裁切,就能获得该贴图帧真正的图像了。

DDS大图像,红色区域的位置是由DDS引用型索引项内独有的IMGV5参数确定的

绝大部分IMGV5所包含的图片数据都是DDS数据,但有极少数的IMGV5也包含普通的点阵数据,例如“sprite_map_chn_battleship_npc.NPK”(目前仅发现一个特例)内的三个IMGV5文件。这个时候IMGV5依然包含两个表,但DDS索引项为空,而普通索引项的格式则与其他版本IMG的索引项相同,这里的索引项中颜色格式与IMGV2相同。

另外,IMGV5文件中依然包含一个类似于IMGV4的调色板的信息,但是该信息在IMGV5中没有任何用途。在绝大部分的IMGV5文件中该调色板的颜色项数为0,也就退化成一个全零双字;但仍有极少数的例外,例如“sprite_map_infernomode.NPK”(也是仅发现一个特例)中的几个IMGV5依然保留着带有颜色项的调色板信息,尽管这些信息没有任何用途。

文件头

16字节字符串(注意空格)“Neople Img File ”

索引表大小

4字节,索引表所占空间。

保留

4字节,为0。

版本号

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

索引表数目

4字节,索引表的表项(主要是DDS引用型,部分也包括指向型和图片型)

DDS索引项数目

4字节,DDS图片的数目

IMG文件大小

4字节,整个IMG文件的大小(不知道有啥用)

调色板数据

首4字节为调色板所包含的颜色数目,之后的4×颜色数目个字节则为具体数据。该数据块在IMGV5中无用,绝大部分IMGV5该字段退化成1个双字,即零,但有些IMGV5还是存在调色板数据的。

DDS索引表

DDS索引项1

由若干个DDS索引项构成,每个DDS索引项28字节,用于存储DDS图像的信息。

该数据可用于查找DDS图片在文件中的位置,或者在制作EX的时候起到指示和显示作用,但DDS文件解析不依赖于该数据。

DDS索引项(28字节)

默认标头

4字节,默认为1。

DDS像素格式

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

0x12(采用FXT1纹理压缩)

0x13(采用FXT3纹理压缩)

0x14(采用FXT5纹理压缩)

序号

4字节,DDS的序号。

压缩前大小

4字节,DDS文件压缩前的大小,即对应图像数据块在IMG文件里的大小。

DDS图像大小

4字节,DDS文件压缩后的大小,即经过ZLIB压缩后DDS文件的大小。

图像宽

4字节,DDS图像宽(一般要求被4整除)。

图像高

4字节,DDS图像高(一般要求被4整除)。

DDS索引项2

DDS索引项3

……

索引表

索引表项1

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

DDS引用型索引项(64字节)

颜色系统

4字节,图像所使用的颜色系统,其值含义如下:

0x12(采用FXT1纹理压缩)

0x13(采用FXT3纹理压缩)

0x14(采用FXT5纹理压缩)

注:DDS引用型索引项首字节大于0x11(LINK),普通的点阵图片型索引项首字节均小于0x11,因此可以通过区分第一字节来确定该索引项的类型。

压缩状态

4字节,图像所采用的压缩方式,其值一般为7,表示ZLIB压缩(图像数据经ZLIB压缩,压缩方式与0x06一样,但是压缩后的数据是DDS文件)

图像宽

4字节,贴图宽

图像高

4字节,贴图高

保留

4字节,为零(此位置原来是图片大小)。

x坐标

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

y坐标

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

帧域宽

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

帧域高

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

保留

4字节,为零。

引用DDS索引项

4字节,表示该贴图由哪个DDS索引项对应的DDS图片上裁切出来。

裁切点左边界

4字节,裁切区域在DDS图片的左边界。

裁切点上边界

4字节,裁切区域在DDS图片的上边界。

裁切点右边界

4字节,裁切区域在DDS图片的右边界。

裁切点下边界

4字节,裁切区域在DDS图片的下边界。

保留

4字节,为零

点阵图片型索引项(36字节)

颜色系统

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

其值含义如下:

0x10(ARGB8888)

0x0F(ARGB4444)

0x0E(ARGB1555)

压缩状态

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”数据开头(但不可以其为标准作为图像数据块的起始点)。

IMGV5图像数据里大部分都是DDS数据,分别对应DDS索引项,而普通索引项中的DDS引用型索引项不对应任何图像数据,点阵型图片索引项对应的点阵图像数据位于DDS数据之后,指向性索引项不对应任何图像数据。

图像数据块2

图像数据块3

……

IMGV5图像数据均为DDS图像,后续会逐渐介绍DDS图像的格式,当然,只会介绍DNF里用到的,详情也可以查看MSDN:https://msdn.microsoft.com/en-us/library/windows/desktop/bb943990(v=vs.85).aspx

IMGV5文件采取纹理压缩,因此较难对其进行编辑,一般将其转化为IMGV2进行编辑。IMGV5文件的好处是节省系统资源消耗,节约内存,但不意味着IMGV5文件的存储空间会变小,并且将其他贴图转化成IMGV5后会丢失一些颜色信息和ALPHA通道信息,因此将补丁或者其他贴图资源以IMGV5形式发布不是一种值得推荐的做法,除非IMGV5是DNF唯一能够读取的版本。

关于DNF的多媒体包NPK文件的那些事儿(7) - IMGV5相关推荐

  1. linux软件安装之详解apt、yum、dnf 和 pkg包安装

    介绍 包管理系统除了安装软件外,它还提供了工具来更新已经安装的包.包存储库有助于确保你的系统中使用的代码是经过审查的,并且软件的安装版本已经得到了开发人员和包维护人员的认可. 在配置服务器或开发环境时 ...

  2. 解决springboot读取jar包中文件的问题

    解决springboot读取jar包中文件的问题 参考文章: (1)解决springboot读取jar包中文件的问题 (2)https://www.cnblogs.com/songxiaotong/p ...

  3. 【Android 热修复】热修复原理 ( 修复包 Dex 文件准备 | Dex 优化为 Odex | Dex 文件拷贝 | 源码资源 )

    文章目录 一.修复包 Dex 文件准备 二.Odex 优化 三.Dex 文件拷贝 四. 源码资源 一.修复包 Dex 文件准备 异常代码 : 故意写一个异常代码 , 并执行该代码 , 肯定会崩溃 ; ...

  4. ear包目录_Java中的JAR/EAR/WAR包的文件夹结构说明(转)

    JAR包:打成JAR包的代码,一般作为工具类,在项目中,会应用到N多JAR工具包. WAR包:JAVA WEB工程,都是打成WAR包,进行发布,如果我们的服务器选择TOMCAT等轻量级服务器,一般就打 ...

  5. linux查看jar包内容命令,【达内Java教程】用linux查看jar包内文件命令

    深圳java培训(sz.java.tedu.cn)专家教你用linux查看jar包内文件命令 jar vtf fileName.jar 用法: jar {ctxui}[vfm0Me] [jar-fil ...

  6. 读取jar包所在目录和jar包内文件

            在网上查找了很多关于读取jar包的相对路径资料,但是大多都是读取jar包内文件的方法介绍,甚至有人将读取包内路径的方法混淆为读取包外路径的方法.经过本人亲自的测试,对于两种读取文件的方 ...

  7. war包里面文件的修改方式

    war包里面文件的修改方式 1 将war包移动到一个干净的路径下,使用 jar xvf ROOT.war 命令将war进行解压操作 2 修改相应的文件内容,修改想要修改的文件,比如web.xml 3 ...

  8. python读取压缩文件的大小_python查看zip包中文件及大小的方法

    python查看zip包中文件及大小的方法 本文实例讲述了python查看zip包中文件及大小的方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/env python import ...

  9. java jar包资源文件_深入jar包:从jar包中读取资源文件

    我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看 ...

  10. 2-SII--应用本包下文件写入和读取

    零.先说一下我的IO小工具方法: 1.IO读写: IO.png 2.读取InputStream /*** 读取InputStream** @param is 输入流* @return 流转化的字符串* ...

最新文章

  1. 雷军22年前写的代码 你见过吗?
  2. Java 基础总结。
  3. scala函数定义示例
  4. Package name must have at least two identifiers 解决办法
  5. 属于PHP语言结构的是,PHP语言结构
  6. openstack quantum搭建过程中一些有用的链接
  7. 编译内核_将驱动编译进内核(Kernel)的步骤记录
  8. THINKPHP增删改查--(改)
  9. spring mvc学习(27):处理数据模型--从表单到controller传输数据续
  10. 设置窗口的光标,设置ToolBar,设置状态栏
  11. pytorch使用说明2
  12. HDU 2686 MCMF
  13. 笔记(八)Jetson Nano 跑通 jetson-inference
  14. stm32c6t6硬件iic接口的使用--以0.96寸oled为例
  15. 我的一点企业上云经验
  16. Android自定义输入法软键盘
  17. Openwrt无线和有线基本配置方法以及luci管理界面安装
  18. 2005计算机885编程题
  19. 聊聊使用 JavaScript 做动画出现卡顿的原因
  20. Winform ERP系统 漂亮图标下载网站|C/S框架网

热门文章

  1. vs2008的永久破解安装
  2. php仿微信界面设计,仿微信源码-泡泡IM
  3. 全国大学生数学建模竞赛2016A题系泊系统的设计MATLAB程序
  4. 【威联通Nas】安装docker版本的wiznote/wizserver
  5. 实对称矩阵的特征值求法_“绝境之下”,如何求解矩阵的特征值?
  6. ab st语言编程手册,PLC编程语言,ST语言秒杀梯形图编程之浮点数计算
  7. AE插件自动创建图层工具LayerGenerators使用教程
  8. 【Allwinner】---搭建 全志平台 开发环境 史上最详细
  9. Hexo博客开发之——theme主题备份上传失败
  10. 前端实战——实现购物车功能