CN113546409B - Laya引擎播放GIF格式资源的方法、存储介质 - Google Patents

Laya引擎播放GIF格式资源的方法、存储介质 Download PDF

Info

Publication number
CN113546409B
CN113546409B CN202010329712.3A CN202010329712A CN113546409B CN 113546409 B CN113546409 B CN 113546409B CN 202010329712 A CN202010329712 A CN 202010329712A CN 113546409 B CN113546409 B CN 113546409B
Authority
CN
China
Prior art keywords
laya
gif format
engine
resource
gif
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202010329712.3A
Other languages
English (en)
Other versions
CN113546409A (zh
Inventor
刘德建
刘芳华
林琛
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujian TQ Digital Co Ltd
Original Assignee
Fujian TQ Digital Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujian TQ Digital Co Ltd filed Critical Fujian TQ Digital Co Ltd
Priority to CN202010329712.3A priority Critical patent/CN113546409B/zh
Publication of CN113546409A publication Critical patent/CN113546409A/zh
Application granted granted Critical
Publication of CN113546409B publication Critical patent/CN113546409B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • AHUMAN NECESSITIES
    • A63SPORTS; GAMES; AMUSEMENTS
    • A63FCARD, BOARD, OR ROULETTE GAMES; INDOOR GAMES USING SMALL MOVING PLAYING BODIES; VIDEO GAMES; GAMES NOT OTHERWISE PROVIDED FOR
    • A63F13/00Video games, i.e. games using an electronically generated display having two or more dimensions
    • A63F13/50Controlling the output signals based on the game progress
    • A63F13/52Controlling the output signals based on the game progress involving aspects of the displayed game scene
    • AHUMAN NECESSITIES
    • A63SPORTS; GAMES; AMUSEMENTS
    • A63FCARD, BOARD, OR ROULETTE GAMES; INDOOR GAMES USING SMALL MOVING PLAYING BODIES; VIDEO GAMES; GAMES NOT OTHERWISE PROVIDED FOR
    • A63F13/00Video games, i.e. games using an electronically generated display having two or more dimensions
    • A63F13/60Generating or modifying game content before or while executing the game program, e.g. authoring tools specially adapted for game development or game-integrated level editor
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/20Processor architectures; Processor configuration, e.g. pipelining
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/60Memory management
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Multimedia (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • Processing Or Creating Images (AREA)

Abstract

本发明提供Laya引擎播放GIF格式资源的方法、存储介质,方法包括:加载GIF格式资源至内存中;在Laya引擎中解析所述GIF格式资源,获取对应的序列帧图片;通过方式一或方式二播放所述序列帧图片;所述方式一为将所述序列帧图片加载至动画控件;所述方式二为将序列帧图片加载至编写了帧动画控件的Image图片控件中。本发明能使Laya引擎支持GIF格式资源的直接播放,从而更具普遍适用性,提高Laya引擎的实用性;能够在Laya引擎中动态解析和播放,实施方式简便、减少交互,提高了解析效率;能够基于二进制比特数据进行动态解析获取序列帧,解析准确率高;能够及时回收无效资源,确保系统性能良好。

Description

Laya引擎播放GIF格式资源的方法、存储介质
技术领域
本发明涉及Laya引擎领域,具体涉及Laya引擎播放GIF格式资源的方法、存储介质。
背景技术
Laya游戏引擎是基于开发Html5游戏的一款游戏引擎,底层渲染是基于Html5原生Canvas画布或者WebGL实现的,由于部分局限性问题而无法支持Html5原生控件直接播放GIF格式图片资源。若直接使用Laya的图片控件播放GIF格式资源会导致图片只能停留在第一帧。代替方案是可以使用LayaIDE制作Laya格式的动画资源。但是,该格式的资源属于Laya引擎的特殊资源,当前普通用户或者非Laya引擎制作美术人员并不具备制作该类资源的能力。
当游戏制作团队由于硬性要求或者资源提供方只能提供通用的GIF特效或动画资源时,在现有技术中,Laya游戏引擎将无法正常展示该资源。
现有技术中,提供了在Laya游戏引擎中使用LayaIDE制作Laya序列帧动画的方式,再使用Animation类播放;还公开了通过LayaIDE制作逐帧动画的方法,具体通过批量选择组件拖拽到时间轴上,直接创建完成逐帧动画,并可以使用时间轴动画编辑器的功能对所述逐帧动画进行优化。上述两种方法都是使用LayaIDE分别制作的Laya帧动画和Laya图集资源,该类资源属于Laya引擎的特殊资源,同样存在普通用户或者非Laya引擎制作美术人员不具备制作该类资源的问题。
因此,有需求提供一种在Laya引擎中直接播放最通用且最普遍的GIF格式图片资源的技术方案。
发明内容
本发明所要解决的技术问题是:提供一种Laya引擎播放GIF格式资源的方法、存储介质,扩展Laya引擎支持播放的资源类型,优化laya引擎的功能。
为了解决上述技术问题,本发明采用的技术方案为:
Laya引擎播放GIF格式资源的方法,包括:
加载GIF格式资源至内存中;
在Laya引擎中解析所述GIF格式资源,获取对应的序列帧图片;
通过方式一或方式二播放所述序列帧图片;所述方式一为将所述序列帧图片加载至动画控件;所述方式二为将序列帧图片加载至编写了帧动画控件的Image图片控件中。
本发明提供的另一个技术方案为:
一种计算机可读存储介质,其上存储有计算机程序,所述程序在被处理器执行时能够实现上述任意一项所述的Laya引擎播放GIF格式资源的方法所包含的步骤。
本发明的有益效果在于:相较于现有的Laya引擎只能播放laya资源(laya帧动画或Laya图集资源),而该类资源的制作难度高,具有很大局限性的不足。本发明对Laya引擎的资源播放类型进行扩展,使其能够播放普遍存在的GIF格式的图片资源,不再受限于仅支持单一格式的资源播放,显著提高了Laya引擎的实用性,能很好地满足更多需求。
附图说明
图1为本发明一实施例一种Laya引擎播放GIF格式资源的方法的流程示意图;
图2为本发明实施例一一种Laya引擎播放GIF格式资源的方法的流程示意图。
具体实施方式
为详细说明本发明的技术内容、所实现目的及效果,以下结合实施方式并配合附图予以说明。
本发明最关键的构思在于:在Laya引擎中解析GIF格式资源为对应的帧序列图片,并能使用原生控件进行播放。
本发明涉及的技术术语解释:
请参照图1,本发明提供Laya引擎播放GIF格式资源的方法,包括:
加载GIF格式资源至内存中;
在Laya引擎中解析所述GIF格式资源,获取对应的序列帧图片;
通过方式一或方式二播放所述序列帧图片;所述方式一为将所述序列帧图片加载至动画控件;所述方式二为将序列帧图片加载至编写了帧动画控件的Image图片控件中。
从上述描述可知,本发明的有益效果在于:本发明能够克服现有技术Laya引擎中仅支持laya资源的播放,且Laya资源制作难度高的问题。本发明通过在Laya引擎中动态解析GIF格式图片资源,实现laya引擎对GIF格式图片资源的支持,从而扩展了laya引擎支持的资源类型,提高了实用性,实现了功能的扩展。
进一步地,所述在Laya引擎中解析所述GIF格式资源,获取对应的序列帧图片,具体为:
通过Laya引擎的图片控件加载所述GIF格式资源;
将所述GIF格式资源设置为允许跨域;
通过加载并解析设置后的GIF格式资源的GIF格式二进制资源,获取图像数据;
解析并解码所述图像数据,得到所述GIF格式资源的每一帧对应的像素数据;
绘制每一帧像素数据至画布控件上,再转码得到所述GIF格式资源对应的序列帧图片。
由上述描述可知,实现了在Laya引擎中对GIF格式资源的拆帧,使其被Laya引擎支持。
进一步地,
所述解析并解码所述图像数据,得到所述GIF格式资源的每一帧对应的像素数据,具体为:
读取图像数据的属性信息,获取块信息;
依据二进制长度,对每个块的图像数据进行解析转义,得到所述GIF格式资源的每一帧对应的像素数据。
由上述描述可知,依据二进制长度将每个块的流数据转化为对应的RGB颜色值,从而获取GIF格式图片每帧的像素数据。
进一步地,所述通过Laya引擎的图片控件加载所述GIF格式资源,之前,还包括:
验证所述GIF格式资源的格式是否为GIF格式。
由上述描述可知,通过简单的验证待解析的资源是否为GIF格式,能够有效排除部分非GIF格式资源,避免后续加载解析处理过程出错,从而减少性能消耗。
进一步地,所述编写了帧动画控件的Image图片控件,具体为:
使用Image图片控件,实现针对帧动画图片在固定或特定时间间隔逐张绘制图像的方法。
由上述描述可知,在Laya的Image图片控件基础上,编写帧动画控件,能够支持修改显示的宽高,控制播放间隔。
进一步地,所述加载GIF格式资源至内存中,具体为:
通过画布控件将GIF格式资源加载到内存中。
由上述描述可知,直接使用原生的Canvas画布控件便可完成GIF格式资源的加载。
进一步地,所述方法还包括:
定时清除内存中存储的GIF格式资源。
由上述描述可知,通过定时清理过期资源,实现资源的及时回收,避免影响系统性能。
本发明提供的另一个技术方案为:
一种计算机可读存储介质,其上存储有计算机程序,所述程序在被处理器执行时能够实现下述Laya引擎播放GIF格式资源的方法所包含的步骤:
加载GIF格式资源至内存中;
在Laya引擎中解析所述GIF格式资源,获取对应的序列帧图片;
通过方式一或方式二播放所述序列帧图片;其中,方式一为将所述序列帧图片加载至动画控件;方式二为将序列帧图片加载至编写了帧动画控件的Image图片控件中。
进一步地,所述在Laya引擎中解析所述GIF格式资源,获取对应的序列帧图片,具体为:
通过Laya引擎的图片控件加载所述GIF格式资源;
将所述GIF格式资源设置为允许跨域;
通过加载并解码设置后的GIF格式资源的GIF格式二进制资源,获取图像数据;
解析并解析所述图像数据,得到所述GIF格式资源的每一帧对应的像素数据;
绘制每一帧像素数据至画布控件上,再转码得到所述GIF格式资源对应的序列帧图片。
进一步地,
所述解析并解码所述图像数据,得到所述GIF格式资源的每一帧对应的像素数据,具体为:
读取图像数据的属性信息,获取块信息;
依据二进制长度,对每个块的图像数据进行解析转义,得到所述GIF格式资源的每一帧对应的像素数据。
进一步地,所述通过Laya引擎的图片控件加载所述GIF格式资源,之前,还包括:
验证所述GIF格式资源的格式是否为GIF格式。
进一步地,所述加载GIF格式资源至内存中,具体为:
通过画布控件将GIF格式资源加载到内存中。
进一步地,所述方法还包括:
定时清除内存中存储的GIF格式资源。
从上述描述可知,对应本领域普通技术人员可以理解实现上述技术方案中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来实现的,所述的程序可存储于一计算机可读取的存储介质中,该程序在执行时,可包括如上述各方法的流程。所述程序在被处理器执行后,同样能够实现对应各方法的有益效果。
其中,所述的存储介质可以是磁盘、光碟、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
实施例一
请参照图2,本实施例提供一种Laya引擎播放GIF格式资源的方法,实现Laya引擎对GIF格式资源的支持,从而不再局限于仅支持单一资源格式,扩展了Laya引擎的功能。
方法包括:
S1:加载GIF格式资源至内存中;
具体使用JavaScript原生的Canvas画布控件将GIF格式图片加载到内存中。
S2:在Laya引擎中解析所述GIF格式资源,获取对应的序列帧图片;即,解析GIF格式资源并且导出base64图片编码格式的单帧图片存放在内存中。
解析过程如下:
S2.1:简单验证加载进来的所谓GIF资源的格式后缀转小写后是否为.gif;若是,则执行下一步;若否,则结束流程,并提示加载的资源非GIF格式。
在具体解析算法中会有对应的格式查错处理,该步骤旨在排除部分非GIF格式资源,避免后续的加载解析处理,减少性能消耗。
S2.2:在Laya中用HTML5原生的HTMLImageElement图片控件装载该图片资源;
S2.3:使用原生XMLHttpRequest设置资源允许跨域属性后,请求加载资源回调的response属性,即GIF格式图像资源;
S2.4:对XMLHttpRequest请求到的资源的response属性进行解析,读取图像数据;
S2.5:解析并解码上述图像数据,得到所述GIF对应每一帧的像素数据;
S2.6:将每帧像素数据绘制到画布HTMLCanvasElement画布控件上,再转码成Laya中可直接显示的图片格式资源,由此获取到GIF格式资源对应的序列帧图片。
在一具体实例中,所述S2.5具体通过以下过程实现:
读取图像数据后,首先去除头部header特定字段以及版本号;然后读取一些特殊属性,特殊属性中包含有多少Block块及具体Block块信息;然后将每个Block块对应二进制长度的Stream流数据进行解析和解码,即将对应块长度的图像数据按每3个单位字节转化为1个RGB颜色值。由此可以得到GIF格式图片每帧对应的流数据,最终得到序列帧图片。该数据可在Laya中使用Laya.Image图片控件或者Laya.Animation动画控件播放,由此解析以LZW格式压缩的GIF文件。
上述步骤S2的具体实现方式,证明了可以在Laya引擎中实现对GIF格式图片资源的拆帧,使其在后续能直接在Laya引擎中播放。
S3:在Laya引擎中播放所述GIF格式资源。
在本实施中,同时提供两种播放方式:
如图2中的S3所示,方式一为直接使用Laya引擎的Animation控件加载步骤S2导出的序列帧图片进行播放,以此实现Laya引擎播放GIF格式图片资源。该播放方式适用于GIF格式图片资源尺寸与显示尺寸相符的场景,因为该方式下,图片显示的宽高无法修改,只能与源GIF资源保持一致,其无法控制播放间隔。
如图2中的S3’所示,方式二为首先在Laya的Image图片控件基础上,编写帧动画控件;然后再加载步骤S2导出的序列帧图片进行播放。该方式解决了方式一存在的问题,能够对GIF格式图片资源的尺寸和播放间隔进行调整。
在一具体实例中,方式二所述的在Laya的Image图片控件基础上,指的是使用Image图片控件,实现针对帧动画图片在固定或特定时间间隔逐张绘制图像的方法。S4:定时清除内存中存储的GIF格式资源。
GIF格式图片资源普遍较大,加载与解析可能会造成卡顿,因此优选在应用载入阶段完成。同时,还将定时回收内存中存储的GIF格式资源,及其解析得到的序列帧图片资源。以此,能够维持系统性能处于良好状态。
实施例二
本实施例对实施例一的步骤S2的具体实现方式做进一步限定:
1、创建一个XMLHttpRequest对象(XMLHttpRequest对象用于在后台与服务器交换数据),调用open(“GET”,GIF资源地址,true)方法,初始化HTTP请求参数,设置XMLHttpRequest的属性overrideMimeType为"text/plain;charset=x-user-defined"(将响应数据按照纯文本格式来解析,字符集替换为用户自己定义的字符集,使得XMLHttpRequest以纯文本格式来解析接收到的blob数据,最终用户通过this.response拿到的就是图片文件对应的二进制字符串)。调用XMLHttpRequest.send()方法(发送HTTP请求,使用传递给open()方法的参数,以及传递给该方法的可选请求体)。在XMLHttpRequest对象的onload方法取到通过this.response拿到的就是图片文件对应的二进制字符串。
上述对应实施例一的S2.2-2.4。
2、由上述1中获取二进制字符串暂存在stream二进制变量中,创建pos数值变量指向当前读取的字节数。
2.1、pos向右移3位,读取3个字节,得到文件标识”GIF”,即该文件为GIF格式图片文件。
2.2、pos向右移3位,读取3个字节,得到文件版本号”87a”或”89a”区分早期版本和新版本。
2.3、pos向右移2位,读取2个字节,将2位比特数组转换为不带符号的正整数得到GIF图片宽度(width)。
2.4、pos向右移2位,读取2个字节,将2位比特数组转换为不带符号的正整数得到GIF图片高度(height)。
2.5、pos向右移1位,读取1个字节,对比该比特字节的二进制标识(1个byte字节有8位长度的二进制标识)。第1位为全局颜色表标志,即为1时表明全局颜色表有定义;第2~4位代表颜色表中每种基色位长(需要+1),为111时,每个颜色用8bit表示,即我们熟悉的RGB表示法,一个颜色三字节;第5位表示是否对颜色表里的颜色进行优先度排序,把常用的排在前面,这个主要是为了适应一些颜色解析度低的早期渲染器,现在已经很少使用了。第6位表示颜色表的长度,计算规则是值+1作为2的幂,得到的数字就是颜色表的项数,取最大值111时,项数=256,也就是说GIF格式最多支持256色的位图,再乘以第2~4位算出的字节数,就是调色盘的总长度。
2.6、pos向右移1位,读取1个字节,定义了图像透明区域的背景色在调色盘里的索引。
2.7、pos向右移1位,读取1个字节,定义了像素宽高比,一般为0。
2.8、pos向右移调色盘总长度位,读取调色盘总长度对应的字节数得到调色盘的所有颜色值GCT(Global Color Table)。
3、读取图形控制扩展块数据,这一部分是可选的(需要89a版本),可以放在一个图象块(图象标识符)或文本扩展块的前面,用来控制跟在它后面的第一个图象(或文本)的渲染(Render)形式。pos向右移1位,读取1字节:
3.1、若该字节为0x21,标识这是一个扩展块,pos向右移1位,读取1字节:
3.1.1、若为0xF9,标识这是一个图形控制扩展块;pos向右移1位,读取1字节该字节为块大小,不包括终结器,固定值是4;pos向右移1位,读取1字节,二进制0~2位为保留项,二进制3~5位为处置方法(disposalMethod:0-不使用处置方法,1-不处置图形,把图形从当前位置移去,2-回复到背景色,3-回复到先前状态,4~7-自定义),二进制第6位为用户数据标志,二进制第7位为透明色标志(transparencyFlag);pos向右移2位,读取2字节为延时时间(delayTime),单位1/100秒,如果值不为1,表示暂停规定的时间后再继续往下处理数据流;pos向右移1位,读取1个字节为透明色索引值(transparencyIndex);pos向右移1位,读取1字节为标识块终结,固定值0。
3.1.2、若为0xFE,标识这是一个注释块;注释块中有一个或多个数据块组成,pos向右移1位,读取1字节,若大于零,则为该数据块大小,读取对应字节数即为该数据块内容,若为0标识注释块结束,循环读取直到注释块结束。
3.1.3、若为0x01,标识这是一个图形文本扩展块;pos向右移1位,读取1字节为块大小,固定值12;pos向右移2位,读取2字节为文本框逻辑屏幕的左边界距离;pos向右移2位,读取2字节为文本框离逻辑屏幕的上边界距离;pos向右移2位,读取2字节为文本框高度;pos向右移2位,读取2字节为文本框高度;pos向右移1位,读取1字节为字符单元格宽度;pos向右移1位,读取1字节为字符单元格高度;pos向右移1位,读取1字节为文本前景色索引;pos向右移1位,读取1字节为文本背景色索引;文本数据块中有一个或多个数据块组成,pos向右移1位,读取1字节,若大于零,则为该数据块大小,读取对应字节数即为该数据块内容,若为0标识注释块结束,循环读取直到标识注释块结束。
3.1.4、若为0xFF,标识这是一个应用程序扩展块;pos向右移1位,读取1字节为块大小,固定值11;pos向右移8位,读取8字节用来鉴别应用程序自身的标识(8个连续ASCII字符);pos向右移3位,读取3字节应用程序定义的特殊标识码(3个连续ASCII字符);应用程序数据块中有一个或多个数据块组成,pos向右移1位,读取1字节,若大于零,则为该数据块大小,读取对应字节数即为该数据块内容,若为0标识注释块结束,循环读取直到标识注释块结束。
3.2、若为0x2C,则为图像标识符开始;pos向右移2位,读取2字节为X方向偏移量;pos向右移2位,读取2字节为Y方向偏移量;pos向右移2位,读取2字节为图像宽度;
pos向右移2位,读取2字节为图像高度;pos向右移1位,读取1字节,二进制第0位为局部颜色列表标识(lctFlag),二进制第1位为交织标识,置位时图象数据使用交织方式排列,否则使用顺序排列,二进制第2位为分类标识,如果置位表示紧跟着的局部颜色列表分类排列,二进制3~4位保留,必须初始化0,二进制5~7位为局部颜色列表大小(lctSize);若lctFlag开启,则需要将2的lctSize+1次方字节数转化为RGB值对应的局部颜色列表(lct)。
3.3、pos向右移1位,读取1字节为LZW编码初始码表大小的位数(lzwMinCodeSize);图像数据块中有一个或多个数据块组成,pos向右移1位,读取1字节,若大于零,则为该数据块大小,读取对应字节数即为该数据块内容,若为0标识注释块结束,循环读取直到标识注释块结束。读取到LZW压缩的图像编码数据(lzwData)。
3.4、LZW算法又叫“串表压缩算法”就是通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩。LZW解压算法步骤:
a、声明临时变量解码数据指针(tempPos)为0,创建动态像素数据输出数值数组(output);
b、声明临时变量清除码(clearCode)为1的lzwMinCodeSize向左位运算,即(2的lzwMinCodeSize次方);
c、声明临时变量结束码(eoiCode)为clearCode加1,判断码大小(codeSize)为lzwMinCodeSize加1;
d、创建动态数据数组(dict),声明临时变量判断码(code)和上一次的判断吗(last);
e、开启循环函数当当前的code为eoiCoded的时候返回output;
f、循环函数中:
f.1、记录last为code(记录上一次的判断码);
f.2、获取判断码,即将lzwData的数据读取1个字符,将其转化成ASCII码字符(是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言),读取它的前7个字节,由二进制转化为十进制即该字符对应的判断码;
f.3、判断当前code是否为clearCode,若是将dict清除,若是codeSize重新赋值lzwMinCodeSize加1,将dict赋值为codeSize长度的每位是对应索引值的数组,且将dict数组的clearCode为置为空数组,eoiCode置为空值,跳过当前循环进去下一次循环;
f.4、当获取到的code小于dict数组的长度且last不等于code,dict数组末尾添加上dict数组的last索引的数组连接到当前dict数组的code索引的数组的第1个数组;
f.5、output数组末尾添加上dict数组的code索引的数组;
f.6、若当前dict数组的长度等于2的codeSize次方长度且codeSize小于12时,需要将codeSize加1;
g、最后返回的output数组即为解压后的当前帧图片像素数据。
4、处理图像数据。
4.1、创建一个HTML画布控件(tmpCanvas,用来在网页上绘制图像以及处理每一像素的像素数据),使用tmpCanvas.getContext(“2d”)获取其context对象(frame,拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法)。
4.2、声明临时变量currIdx标记当前处理的是第几帧,若currIdx不为第1帧,判断lastDisposalMethod(上一帧的处置方法,会在清除当前帧后等于disposalMethod),若lastDisposalMethod不等于3则将disposalRestoreFromIdx(回复到第几帧)记录为上一帧,若lastDisposalMethod等于3,判断disposalRestoreFromIdx不为空将frame.putImageData(frames[disposalRestoreFromIdx].data,0,0)输入上一帧的图像数据,反之调用frame.clearRect将绘制图像区域清空。若lastDisposalMethod为2,也是将绘制图像区域清空。frames用来存放每帧的图片数据。
4.3、声明变量transparency(透明度),若transparencyFlag打开,则transparency为transparencyIndex,否则为null;声明变量ct(当前颜色列表),若lctFlag打开,则使用lct反之使用gct。
4.4、创建一个临时的图片数据结构(imgData)由frame.getImageData获取当前帧的图片数据获得,遍历该图像数据的每一个像素,判断当前的像素值(pixel),若pixel不等于transparency,则
imgData[pixelIndex*4+0]=ct[pixcel][0];
imgData[pixelIndex*4+1]=ct[pixcel][1];
imgData[pixelIndex*4+2]=ct[pixcel][2];
imgData[pixelIndex*4+3]=255;
即将每个像素点的值从对应的颜色列表中获取,第四位为透明度(有判断transparency此处全部为不透明255),pixelIndex为遍历的像素点索引。
4.5、将frame.putImageData(imgData)再次将imgData写入画布内容中。
4.6、调用tmpCanvas.toDataURL(“image/png”)即可将图像数据转化为前缀为data:协议的URL,其允许内容创建者向文档中嵌入小文件,该文件类型即可被文中的Laya.Image直接用来显示图像内容。
4.7、将将imgData存储到frames中,以便剩下的帧处理处置方法。
5、重复3与4的步骤直到获取到最后一个为0的字节,即标志GIF的所有帧解析完成。
上述对应实施例一的S2.5-2.6。上述的2.1~2.2对应解析文件头,2.3~2.8对应解析调色板数据区,3对应解析图像数据区,4对应解析图像数据区,5对应解析结束标志区。
实施例三
本实施例对应实施例一,提供一具体运用场景:
在Edbox项目中,由于目标用户是普通玩家,学生等。他们不具备能制作Laya格式的特效资源的能力,但是有能力从网络上下载、制作动态表情包,甚至使用Photoshop等工具制作一些GIF资源等。当该类特效资源制作好后会上传到项目的资源服务器,在实际游戏中可以根据该类资源的标识码(项目中资源对应的标识码),从资源服务器上获取到下载地址,即可GIF图片资源在网页上加载。
根据项目中的资源标识码获取到资源库中对应的资源URL,在Laya中简单判断URL的资源后缀是否是.gif,若否则资源类型错误,反之开始资源解析。创建XMLHttpRequest对象设置跨域属性,若不设置跨域属性可能导致资源无法下载或无法在前端中对资源数据进行解析处理。在Laya中创建一个XMLHttpRequest对象,加载URL,在加载完成回调里面对返回的资源的responseText资源内容进行解析。分辨按具体流程中的解析过程解析文件头,逻辑屏幕描述区,调色板数据区,图像数据区,结束标志区后,将解析后创建HTMLCanvas用来加载图像数据区的内容,分别把每帧对应的图片数据转化为Laya.Image图片控件可以使用的前缀为data:协议的URL以及获取每帧对应的时延。在实际游戏中若要实际按照GIF资源每帧时延处理,需要自定义帧动画控件,即按照解析出来的GIF单帧时延播放GIF资源,同时自定义脚本能根据自定义需求修改每帧展示的图片大小以及位置。若无硬性要求,可使用Laya.Animation动画控件加载对应的帧数据,该帧动画控件无法设置帧间隔以及特效播放大小。图像数据在上述两种类型资源控件中加载后即可根据需求在特定时机以及特定区域展示GIF资源特效。最后根据实际游戏需求管理GIF资源数据。
实施例四
本实施例对应实施例一和实施例三,提供一种计算机可读存储介质,其上存储有计算机程序,所述程序在被处理器执行时能够实现上述实施例一至实施例三所述的Laya引擎播放GIF格式资源的方法所包含的步骤。具体的步骤内容在此不进行复述,详情请参阅实施例一和实施例三的记载。
综上所述,本发明提供的Laya引擎播放GIF格式资源的方法、存储介质,能使Laya引擎支持GIF格式资源的直接播放,从而更具普遍适用性,提高Laya引擎的实用性;能够在Laya引擎中动态解析和播放,实施方式简便、减少交互,提高了解析效率;能够基于二进制比特数据进行动态解析获取序列帧,解析准确率高;能够及时回收无效资源,确保系统性能良好。
以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等同变换,或直接或间接运用在相关的技术领域,均同理包括在本发明的专利保护范围内。

Claims (5)

1.Laya引擎播放GIF格式资源的方法,其特征在于,包括:
加载GIF格式资源至内存中;
在Laya引擎中解析所述GIF格式资源,获取对应的序列帧图片;
通过方式一或方式二播放所述序列帧图片;所述方式一为将所述序列帧图片加载至动画控件;所述方式二为将序列帧图片加载至编写了帧动画控件的Image图片控件中;
所述在Laya引擎中解析所述GIF格式资源,获取对应的序列帧图片,具体为:
通过Laya引擎的图片控件加载所述GIF格式资源;
所述通过Laya引擎的图片控件加载所述GIF格式资源具体为:
在Laya引擎中用HTML5原生的HTMLImageElement图片控件装载所述GIF格式资源;
将所述GIF格式资源设置为允许跨域;
所述将所述GIF格式资源设置为允许跨域具体为:
使用原生XMLHttpRequest设置所述GIF格式资源允许跨域属性;
通过加载并解析设置后的GIF格式资源的GIF格式二进制资源,获取图像数据;
所述通过加载并解析设置后的GIF格式资源的GIF格式二进制资源,获取图像数据具体为:
请求加载GIF格式资源回调的response属性,对XMLHttpRequest请求到的GIF格式资源的response属性进行解析,读取图像数据;
解析并解码所述图像数据,得到所述GIF格式资源的每一帧对应的像素数据;
绘制每一帧像素数据至画布控件上,再转码得到所述GIF格式资源对应的序列帧图片;
所述绘制每一帧像素数据至画布控件上,再转码得到所述GIF格式资源对应的序列帧图片具体为:
将每帧像素数据绘制到画布HTMLCanvasElement画布控件上,再转码成Laya引擎中可直接显示的图片格式资源,由此获取到GIF格式资源对应的序列帧图片;
所述解析并解码所述图像数据,得到所述GIF格式资源的每一帧对应的像素数据,具体为:
读取图像数据的属性信息,获取块信息;
依据二进制长度,对每个块的图像数据进行解析转义,得到所述GIF格式资源的每一帧对应的像素数据。
2.如权利要求1所述的Laya引擎播放GIF格式资源的方法,其特征在于,所述通过Laya引擎的图片控件加载所述GIF格式资源,之前,还包括:
验证所述GIF格式资源的格式是否为GIF格式。
3.如权利要求1所述的Laya引擎播放GIF格式资源的方法,其特征在于,所述加载GIF格式资源至内存中,具体为:
通过画布控件将GIF格式资源加载到内存中。
4.如权利要求1所述的Laya引擎播放GIF格式资源的方法,其特征在于,所述方法还包括:
定时清除内存中存储的GIF格式资源。
5.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述程序在被处理器执行时能够实现上述权利要求1-4任意一项所述的Laya引擎播放GIF格式资源的方法所包含的步骤。
CN202010329712.3A 2020-04-24 2020-04-24 Laya引擎播放GIF格式资源的方法、存储介质 Active CN113546409B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010329712.3A CN113546409B (zh) 2020-04-24 2020-04-24 Laya引擎播放GIF格式资源的方法、存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010329712.3A CN113546409B (zh) 2020-04-24 2020-04-24 Laya引擎播放GIF格式资源的方法、存储介质

Publications (2)

Publication Number Publication Date
CN113546409A CN113546409A (zh) 2021-10-26
CN113546409B true CN113546409B (zh) 2024-04-05

Family

ID=78129489

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010329712.3A Active CN113546409B (zh) 2020-04-24 2020-04-24 Laya引擎播放GIF格式资源的方法、存储介质

Country Status (1)

Country Link
CN (1) CN113546409B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115035218B (zh) * 2022-08-11 2022-11-01 湖南湘生网络信息有限公司 交互动画制作方法、装置、计算机设备和存储介质

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102314701A (zh) * 2011-06-28 2012-01-11 北京新媒传信科技有限公司 移动设备中实时播放gif动画的方法及装置
CN102364459A (zh) * 2011-06-28 2012-02-29 广州市动景计算机科技有限公司 基于移动终端的网页Flash动画显示方法和装置
CN104102488A (zh) * 2014-07-18 2014-10-15 无锡梵天信息技术股份有限公司 一种基于多线程并行化的3d引擎系统
CN105677883A (zh) * 2016-01-14 2016-06-15 网易(杭州)网络有限公司 动画资源的优化方法和装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20070030273A1 (en) * 2005-08-08 2007-02-08 Lager Interactive Inc. Method of serially connecting animation groups for producing computer game

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102314701A (zh) * 2011-06-28 2012-01-11 北京新媒传信科技有限公司 移动设备中实时播放gif动画的方法及装置
CN102364459A (zh) * 2011-06-28 2012-02-29 广州市动景计算机科技有限公司 基于移动终端的网页Flash动画显示方法和装置
CN104102488A (zh) * 2014-07-18 2014-10-15 无锡梵天信息技术股份有限公司 一种基于多线程并行化的3d引擎系统
CN105677883A (zh) * 2016-01-14 2016-06-15 网易(杭州)网络有限公司 动画资源的优化方法和装置

Also Published As

Publication number Publication date
CN113546409A (zh) 2021-10-26

Similar Documents

Publication Publication Date Title
US10497086B2 (en) Methods and apparatuses for providing a hardware accelerated web engine
KR101569765B1 (ko) 중간 포맷을 이용한 swf와 html의 크로스-컴파일링
US8982132B2 (en) Value templates in animation timelines
US20030034989A1 (en) Application editing apparatus and data processing method and program
JP4898615B2 (ja) 情報処理装置および符号化方法
KR20150079867A (ko) Html5-프로토콜 기반 웹페이지 표시 방법 및 장치
US20100064209A1 (en) Method for transforming web page objects
CN109658485B (zh) 网页动画绘制方法、装置、计算机设备和存储介质
CN111930289B (zh) 一种处理图片和文本的方法和系统
CN111241793A (zh) 解析富文本编辑器内容给原生客户端渲染的方法、系统及介质
CN113546409B (zh) Laya引擎播放GIF格式资源的方法、存储介质
CN117544826B (zh) 一种字幕文件编辑方法及加载应用的字幕编辑器
US8645822B2 (en) Multi-platform presentation system
CN111273903B (zh) 网页制作方法、装置、计算机设备及计算机存储介质
JP2006048695A (ja) スクリプト特性によるテキストデータ処理装置及び方法
US9412187B2 (en) Delayed rendering of content
CN111541901B (zh) 图片解码的方法和装置
CN114527990A (zh) 基于配置化的二进制数据反序列化方法、装置及存储介质
CN113377453A (zh) 图片处理方法、装置与电子设备
US8386922B2 (en) Information processing apparatus and information processing method
CN113127785A (zh) 字幕处理方法、装置、计算机设备及存储介质
Concolato et al. Design of an efficient scalable vector graphics player for constrained devices
KR20080048698A (ko) 오픈 벡터그래픽 콘텐츠 생성 방법 및 그 방법이 기록된컴퓨터로 읽을 수 있는 기록매체
CN114218895B (zh) 对uof文档进行转换的方法
CN114610920B (zh) 图像存储格式的生成方法、图像存储格式及处理系统

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant