热门标签 | 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以修正这些变量。


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 帝国CMS多图上传插件详解及使用指南
    本文介绍了一款用于帝国CMS的多图上传插件,该插件通过Flash技术实现批量图片上传功能,显著提升了多图上传效率。文章详细说明了插件的安装、配置和使用方法。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 如何高效创建和使用字体图标
    在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ... [详细]
  • 本文介绍如何使用 Python 提取和替换 .docx 文件中的图片。.docx 文件本质上是压缩文件,通过解压可以访问其中的图片资源。此外,我们还将探讨使用第三方库 docx 的方法来简化这一过程。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 本文详细探讨了网站流量统计中常用的三个关键指标:页面浏览量(PV)、独立访客数(UV)和独立IP数(IP)。通过分析这些指标的定义、计算方法及其应用场景,帮助网站运营者更好地理解用户行为,优化网站内容与用户体验。 ... [详细]
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社区 版权所有