热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

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

IMGV21.介绍IMGV2是IMG文件结构的第二个版本,广泛用于DNF中大部分的贴图文件,所有的UI(按钮、对话框、广告图片、loading画面、地下城选择框等等)、图标(比如

IMGV2

1.    介绍

IMGV2是IMG文件结构的第二个版本,广泛用于DNF中大部分的贴图文件,所有的UI(按钮、对话框、广告图片、loading画面、地下城选择框等等)、图标(比如装备、装扮、消耗品、地面物品)、标志(比如物品品级框、伤害数字、装备锁等等)、称号贴图都使用IMGV2。

在2016年之前,几乎所有DNF贴图都是IMGV2格式(少数是IMGV1格式),在那之后,时装贴图被IMGV4代替,技能特效贴图也逐渐被IMGV5代替。对现在的版本,IMGV2的时装和技能特效基本见不到了,但是IMGV2版本的补丁依然是生效的。

IMGV2的特点是可以兼容任意复杂的贴图,易于点阵操作;但图像数据块所占空间大,读取速度较慢。

2.    结构

IMGV2的结构如下表所示:

文件头

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

索引表大小

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

保留

4字节,为0。

版本号

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

索引表数目

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

索引表

索引表项1

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

 

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

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

图像数据块2

图像数据块3

……

3.    图像数据

关于ZLIB压缩的贴图数据,可以使用ZLIB官方提供的库来进行解压缩,网上有很多ZLIB的使用教程(编译和使用),我们一般只使用两个函数 compress(压缩)和uncompress(解压),都是简单的对字节流进行操作,这里不在赘述。ZLIB官方地址:http://www.zlib.net/。代码是完全开源和免费的。

       对于IMGV2来说,以“0x78、0x9C”开头的数据解压出的数据就是对应的像素点阵数据,可以根据颜色系统来分解成对应的像素颜色数据,然后根据图像索引项内的宽和高(高其实没啥必要)来使其二维化。

4.    关于图像读取与指向帧

在系统读取(提取)所需要的贴图时,一般都先指定所要提取图片的帧号。所谓帧号就是IMG文件内图像按索引表顺序存放的一个有序序号。第一帧(第一个贴图)就是0号帧,第二帧就是1号帧,以此类推。

系统在通过帧号提取图片时,若帧号索引项是图片索引项,就会根据在此之前的图片索引项内图像数据大小来跳过特定的数据,从而找到对应图片索引项的图片数据的起点。然后根据图片索引项内的图像数据大小来提取出整个图像数据块,然后对这个图像数据块进行解压(如果需要的话),通过颜色系统转换成点阵数据,就可以直接显示了。

若帧号索引项是指向型索引项(也就是指向帧),则系统通过该索引项的第二字节,也就是指向帧号来寻找对应的索引项,倘若对应的索引项依然是指向型索引项,则会继续寻找下去,直到找到图像索引项为止,然后根据上述的过程提取对应的图片。

当多个帧号指向同一图片时,指向型索引项允许其不需要存储相同的数据,因此极大地节省了IMG文件的空间。但是,这也产生了一个问题,即指向型索引项有可能像链表那样,指向型索引项指向了一个无意义或者并不存在的索引项(例如指向-1);或者甚至地,产生有向闭环结构,最简单的情形就是指向型索引项指向自己。前者会使界面产生红X,甚至导致严重的贴图错误;后者则更严重,使得系统不断地尝试进行贴图读取,进而使游戏直接崩溃(因而也有些人用EX制作整人补丁,比如深渊一出SS读取史诗特效的时候就游戏崩溃)。因此在使用指向型索引项的时候,最好能避免其指向其他的指向型索引项。

5.    增加一个贴图的流程

增加一个贴图,需要修改3个内容:首先,是文件开头的索引表数目和索引表大小要增加;其次,索引表的里面的指定帧号对应的位置要添加出新的图片数据的索引项;最后,根据指定帧号和对应位置在图像数据块中间插入目标图片数据(当然,要使用ZLIB进行压缩)。

值得注意的是,不像NPK内的IMG索引表,由于IMG内的图像索引表内没有存储偏移量数据,所以在对单个的IMG数据进行增加贴图操作时,几乎除了这三个部分之外都不需要改动,但如果使用的用于存储图像数据系列的数据结构(这些数据结构一般是EX开发人员自定义的)内部含有偏移量数据,最好重新读取IMG以修正这些变量。


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
  • 前端性能优化无损压缩webp格式的图片
    一、什么是webpWebP格式,谷歌开发的一种旨在加快图片加载速度的图片格式。图片压缩体积大约只有JPEG的23,并能节省大量的服务器宽带资源和数据空 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
author-avatar
陈晏亚363951
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有