关注「编程小王子」公众号回复【头像生成器】获得源码!

下面我重点介绍一下Cocos Creator H5头像生成的实现方法:

  1. 获取手机相册图片
  2. 在 Cocos Creator 中加载相册图片
  3. Cocos Creator 屏幕截图
  4. 使用HMTL显示截屏图片
  5. 保存图片到相册

获取相册图片

要获取手机相册图片,需要使用浏览器 input 标签提供的能力,在桌面浏览器上则是浏览文件目录选择图片。

使用 document 动态创建 input HTML标签,并设置属性为type 为 file,accept 为"image/*",同时使用 CSS 控件一下 input 的位置

let input = document.createElement("input");
input.setAttribute('type', 'file');
input.setAttribute('accept', 'image/*');
input.setAttribute('style', 'position:absolute;margin-left:30%;margin-top:50px;-webkit-user-select:file')
document.getElementsByTagName('body')[0].appendChild(input);

当选择好图片后,还需要监听 input 标签的 change 事件,我们好方便获取图片的数据:

let oninput = (e) => {
//拿到文件对象
var file = e.target.files[0];
//读取文件数据
reader = new FileReader();
reader.readAsDataURL(file);
//文件加载成功以后,渲染到页面
reader.onload = (e)=> {
...
}
} //监听input的change事件
input.addEventListener('change', oninput);

在 Cocos Creator 中加载相册图片

FileReader 的 onload 回调事件中,我们将图片放入 HTML 的 img 标签中

reader.onload = (e)=> {
//创建一个img标签加载图片数据
var img = document.createElement("img");
img.src = e.target.result;
//再通过img转换成Creator的Textures2D对象
let texture = new cc.Texture2D();
texture._nativeAsset = img;
texture.on('load', () => {
//最后设置到精灵上
this.sprite.spriteFrame = new cc.SpriteFrame(texture);
})
}
  1. 创建 img 标签,将读取到的图片设置到 img.src 属性
  2. 创建 cc.Texture2D 对象,加载 img 中的纹理
  3. 当 Textrue2D 的 load 事件完成,就可以显示到精灵组件上了

这里需要注意,Cocos Creator 不能显示超过2048 * 2048的图片,你会发现直接在手机上使用手机拍的高清图片显示出来是一片黑色。

Cocos Creator 屏幕截图

设置头像的前景框非常简单,这里就不多说了,我看怎么把合成的图片保存下来。这里是参考的Cocos Creator的范例合集中capture_to_web的做法,简单修改了一下,点击按钮生成截图:

save () {
//创建 HTML canvas 标签保存图像数据
this.createCanvas();
//将canvas的图数据保存到HTML img元素上
var img = this.createImg();
//显示这个HTML img 元素
this.showImage(img);
this.iconBg.active = true;
this.label.node.active = true;
}

这里生点看下ShowImage这个函数,我在修改了范例合集的作法:

showImage(img) {
//var img = document.createElement("img");
let offset = (cc.view._frameSize.width - this.srpite.node.width) / 2;
let top = (cc.view._frameSize.height - this.srpite.node.width) / 2;
cc.log('fs:', cc.view._frameSize.width);
cc.log('offset:', offset, img.width);
img.setAttribute('style', `position:absolute;margin-left:${offset}px ;margin-top:${top}px`);
document.getElementsByTagName('body')[0].appendChild(img);
this._img = img;
}

上面的代码主要是计算 img 元素的位置,将它放到浏览器屏幕中间。

保存图片到相册

Cocos Creator 引擎在浏览器上是不能写文件的,因此我们上面是将图片用HTML img 显示,而不是用Sprite显示。我们在手机上长按 img 元素就可以调出浏览器的保存菜单了,在桌面浏览器上可以鼠标右键保存,也可以直接拖动到桌面上。

小结

使用 Cocos Creator 不仅可以开发游戏,也能制作有效的小应用,如果在头像上加载一些Shader特效是不是会更酷呢?

教你使用Cocos Creator制作国旗头像生成器,附源码!的更多相关文章

  1. Google Spreadsheet Add-on Links Extractor 谷歌表格插件链接提取器的制作与发布(附源码)

    引言 为什么想到制作这么一个插件呢,是因为博主在更新微信公众号[刷尽天下]的后台数据库时,需要有博客园题目帖子的链接,那么就要从这篇帖子 LeetCode All in One 题目讲解汇总(持续更新 ...

  2. 教你搭建SpringSecurity3框架( 更新中、附源码)

    源码下载地址:http://pan.baidu.com/s/1qWsgIg0 一.web.xml <?xml version="1.0" encoding="UTF ...

  3. 教你搭建SpringMVC框架( 更新中、附源码)

    一.项目目录结构 二.SpringMVC需要使用的jar包 commons-logging-1.2.jar junit-4.10.jar log4j-api-2.0.2.jar log4j-core- ...

  4. 使用 SVG 制作单选和多选框动画【附源码】

    通过 JavaScript 实现 SVG 路径动画,我们可以做很多花哨的东西.今天我们要为您介绍一些复选框和单选按钮效果.实现的主要思路是隐藏原生的输入框,使用伪元素创造更具吸引力的样式,输入框被选中 ...

  5. 8个纯CSS3制作的动画应用及源码

    对于一个复杂的图形或者动画来说,之前我们的处理方式是图片叠加或者利用CSS+JavaScript的方法,然而随着CSS3标准的不断成熟,我们甚至完全可以利用CSS3来绘制一些图片和制作丰富的动画特效. ...

  6. H5类似易企秀/编辑器/页面制作/开发/生成工具/软件/源码/授权

    代码地址如下:http://www.demodashi.com/demo/14960.html 项目简介 H5DS (HTML5 Design software) 这是一款基于WEB的 H5制作工具. ...

  7. Delphi制作QQ自动登录器源码

    Delphi制作QQ自动登录器源码  http://www.cnblogs.com/sunsoft/archive/2011/02/25/1964967.html 以TM2009为例,检查了一下,未登 ...

  8. cocos creator制作微信小游戏

    2019-05-30 22:11:47 基础: javaScript基础   https://www.bilibili.com/video/av34087791?from=search&sei ...

  9. DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码

    前不久,公司举办了15周年庆,其中添加了一个抽奖环节,要从在读学员中随机抽取幸运学员,当然,这个任务就分到了我这里. 最后的效果如下,启动有个欢迎页面,数据是来自Excel的,点击开始则上面的学号及姓 ...

随机推荐

  1. python修改内存,(修改植物大战僵尸)

    import win32process # 进程模块 import win32con # 系统定义 import win32api # 调用系统模块 import ctypes # c语言类型 imp ...

  2. B-generator 1_2019牛客暑期多校训练营(第五场)

    题意 给出\(x0,x1,a,b\), \(x_i = a\cdot x_{i-1} + b\cdot x_{i-2}\),问\(x_n取模mod\) 题解 用十进制快速幂,二进制快速幂是每到下一位就 ...

  3. BZOJ4034 [HAOI2015]树上操作+DFS序+线段树

    参考:https://www.cnblogs.com/liyinggang/p/5965981.html 题意:是一个数据结构题,树上的,用dfs序,变成线性的: 思路:对于每一个节点x,记录其DFS ...

  4. C++数据类型(data type)介绍

    在编写程序时,数据类型(data type)定义了使用存储空间的(内存)的方式. 程序员通过定义数据类型(data type),告诉特定存储空间这里要存储的数据类型是什么,以及你即将操作他的方式.(注 ...

  5. Flask源码浅析

    前言 学习一样东西,要先知其然,然后知其所以然. 这次,我们看看Flask Web框架的源码.我会以Flask 0.1的源码为例,把重点放在Flask如何处理请求上,看一看从一个请求到来到返回响应都经 ...

  6. Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.apache.catalina.connector.CoyoteWriter and no properties discovered to create BeanSerializer

    一.什么是序列化In computer science, in the context of data storage, serialization is the process of transla ...

  7. Request请求的应用

    1.通过request获得请求行 获得客户端的请求方式:String getMethod() 获得请求的资源: String getRequestURI()   StringBuffer getReq ...

  8. [DP]最长公共子串

    题目 给定两个字符串str1和str2, 长度分别稳M和N,返回两个字符串的最长公共子串 解法一 这是一道经典的动态规划题,可以用M*N的二维dp数组求解.dp[i][j]代表以str1[i]和str ...

  9. [DP]换钱的方法数

    题目三 给定数组arr, arr中所有的值都为整数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,在给定一个整数aim代表要找的钱数,求换钱有多少种方法. 解法一 --暴力递归 用0 ...

  10. 初始mqtt服务

    MQTT入门 概念 mqtt意为消息队列遥测传输,是IBM开发的一个即时通讯协议.由于其维护一个长连接以轻量级低消耗著称,所以常用于移动端消息推送服务开发. 协议格式 mqtt协议控制报文的格式包含三 ...