当前位置: 首页 > news >正文

【咸鱼教程】本地图片上传。动态GIF表情图生成

本案例参考:http://emoji.decathlon.trustingme.cn/
但是实现方式不一样。
 


教程目录
一 head first
二 打开本地图片功能
三 拖拽和缩放手势,调整图片
四 gifjs工具类动态表情合成
五 demo源码下载


一 head first
显示原理
1.1 利用<input>标签打开本地图片。
1.2 FileReader读取图片,生成base64字符串给Egret显示。
1.3 Egret中利用RenderTexture截取多张表情图的base64字符串,传给gifjs工具类生成动态GIF。
 

二 本地图片上传
首先我们实现打开本地图片功能。微信里有图片接口,但是还得接微信jssdk。
我们这里用<input>标签实现。

[AppleScript]  纯文本查看 复制代码
?
1
< input type = "file" id = "uploadImg" >



页面显示效果这样
<ignore_js_op> 
我们把它隐藏起来,不然显示在游戏里就很丑了。

[AppleScript]  纯文本查看 复制代码
?
1
< input type = "file" id = "uploadImg" style = "display:none" / >



我们在exml上创建一个上传按钮,ID为openFileBtn。
创建一个确认按钮,ID为okBtn。
再创建一个图片的容器。里面有3层,顶层表情遮罩图,中间放我将要上传的图片,底层放表情背景。
 


我们在ts里监听我要换脸按钮的点击事件,当点击“我要换脸”时,触发input标签的click事件。
这样即使我们隐藏了input标签,仍然能使用input标签的打开本地文件的功能。

[AppleScript]  纯文本查看 复制代码
?
1
2
3
var uploadImg : any = document .getElementById ( "uploadImg" ) ;
uploadImg.onchange = this.onChang;
uploadImg.click ( ) ;



点击“我要换脸”,看看input标签生效了吧。手机上的效果则是让你选择打开相册。
 


我们选择的是彭于晏,然后用FileReader加载打开的图片,将read结果base64字符串赋值给eui.Image,这样才能把彭于晏显示在exml中。

[AppleScript]  纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
private onChang ( ) {
         / / 获取选择图片
         var uploadImg : any = document .getElementById ( "uploadImg" ) ;
         var file = uploadImg.files[ 0 ];
         / / 判断图片类型
         var imageType = / ^ image \ / / ;
         if ( !imageType.test ( file .type ) ) {
             alert ( "请选择图片类型上传" ) ;
             return ;
         }
         / / 加载图片
         var reader = new FileReader ( ) ;
         reader.onload = function ( ) {
             window [ "homeScene" ].loadFileComplete ( reader. result ) ;
         }
         reader.readAsDataURL ( file ) ;
     }




this.myImg是拖动到exml上的eui.Image组件,用来显示加载图片的。

[AppleScript]  纯文本查看 复制代码
?
1
2
3
4
5
6
/ / 加载图片完成
public loadFileComplete ( result ) {
         / / 将加载图片的数据赋值给myImg
         this.myImg.addEventListener ( egret.Event.COMPLETE , this.onMyImgComplete , this ) ;
         this.myImg.source = result ;
}



三 拖拽和缩放手势,调整图片
然后我们需要调整这个图片的位置和比例。
这里我自己写了2个手势。具体看源码,代码太多就不贴了。
gesturePinch
gestureDrag

上传本地图片后。
 


四 gifjs工具类动态表情合成
我们调整完图片后,选择“确认生成”。
将图片容器pictrueGroup截图成几张renderTexture,用于gif显示。

[AppleScript]  纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
/ / 截取合成图
  var render : egret.RenderTexture = new egret.RenderTexture ( ) ;
  render.drawToTexture ( this.pictureGroup , new egret.Rectangle ( 0 , 0 , 400 , 350 ) ) ;
  var img : eui.Image = new eui.Image ( ) ;
  img.texture = render;
  
  var list = [];
  list .push ( img.texture.toDataURL ( "image/png" ) ) ;
  
  var render 2 : egret.RenderTexture = new egret.RenderTexture ( ) ;
  this.imgGroup.y = 15 ;
  render 2. drawToTexture ( this.pictureGroup , new egret.Rectangle ( 0 , 0 , 400 , 350 ) ) ;
  var img 2 : eui.Image = new eui.Image ( ) ;
  img 2. texture = render 2 ;
  
  list .push ( img 2. texture.toDataURL ( "image/png" ) ) ;


注:我这里表情为了省事随便调的,就把y调了一下。实际根据需求,要更换表情图,挪动彭于晏,就像摆pose拍照一样。


现在我们已经截取了两张表情图的base64字符串了,下面我们来合成gif。
先创建显示gif的<img>标签。
我们获取egret的div,这里我设置id为gameDiv。 然后在这个div下创建一个img标签,id为"gif",这个标签将会用来显示gif。

[AppleScript]  纯文本查看 复制代码
?
1
2
3
4
5
6
/ / 创建Gif
var htmlImg;
var gameDiv = document .getElementById ( "gameDiv" ) ;
htmlImg = document .createElement ( "img" ) ;
htmlImg. id = "gif" ;
gameDiv.appendChild ( htmlImg ) ;




我们把几张截图生成base64字符串数组,传递给gifjs的createGIF,这段代码会在id为"gif"的<img>标签下生成动态GIF。
createGIF写在index.html里。

[AppleScript]  纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
< ! -- create gif -->
         < script src = "gifshot.min.js" > < / script >
         < script >
                 function createGif ( imgList ) {
                         var src = imgList;
                         gifshot.createGIF ( {
                         gifWidth : 400 ,
                         gifHeight : 350 ,
                         images :  src ,
                         interval : 1.0
                         } , function ( obj ) {
                         if ( !obj. error ) {
                         var image = obj. image ;
                         var imageDIV = document .getElementById ( 'gif' )
                         imageDIV.src = image ;
                         }
                         } ) ;
                 }
         < / script >
         < ! -- create gif end-->




生成的gif效果:
 

 




五 demo源码下载

转载于:https://www.cnblogs.com/gamedaybyday/p/9219972.html

相关文章:

  • HTML_列表标签
  • docker基础
  • jstack
  • linux常用命令与终端快捷键总结
  • 别让程序员停止在35岁,如何让我们走得更远?
  • jQuery获取URL中的参数
  • try{ } catch (e){ }的理解
  • jQuery = 1.11.3 DomXSS漏洞
  • EOS多节点组网:商业场景分析以及节点启动时序
  • maven与sbt修改国内镜像
  • U盘安装Linux CentOS 6.8 系统
  • 5.20界面初步完成
  • spring mvc 文件上传 ajax 异步上传
  • react-native
  • C语言学习(42)
  • JavaScript-如何实现克隆(clone)函数
  • [译] React v16.8: 含有Hooks的版本
  • ➹使用webpack配置多页面应用(MPA)
  • Hibernate最全面试题
  • Java深入 - 深入理解Java集合
  • Java-详解HashMap
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • laravel with 查询列表限制条数
  • Laravel 中的一个后期静态绑定
  • Phpstorm怎样批量删除空行?
  • spring boot 整合mybatis 无法输出sql的问题
  • TypeScript迭代器
  • vue 个人积累(使用工具,组件)
  • VuePress 静态网站生成
  • WePY 在小程序性能调优上做出的探究
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 回顾 Swift 多平台移植进度 #2
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何合理的规划jvm性能调优
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • #100天计划# 2013年9月29日
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (k8s中)docker netty OOM问题记录
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (三)c52学习之旅-点亮LED灯
  • (十一)c52学习之旅-动态数码管
  • (五)Python 垃圾回收机制
  • (转)jdk与jre的区别
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)大道至简,职场上做人做事做管理
  • (转)重识new
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET设计模式(8):适配器模式(Adapter Pattern)