图片合成

图片合成是h5案例中常用的展现方式,成功案例也有很多,譬如:

今天,小五就一个小demo来和大家磨叨磨叨图片合成的具体实现方法。

一、界面样式:

二、所用技术:

easeljs + interact.js,easeljs是方便对canvas进行操作,interact.js主要是用来调整图片的位置大小的。

三、程序流程图:

四、核心步骤及代码:

① 上传图片

/*上传图片*/

document.getElementById('inputimg').onchange = function() {

var fileObj = document.getElementById('inputimg').files[0];

if (document.getElementById('inputimg').files.length === 0)

{

return;

}

var oFile = document.getElementById('inputimg').files[0];

if (!rFilter.test(oFile.type)) {

alert("You must select a valid image file!");

return;

}

oFReader.readAsDataURL(oFile);

};

var imgthis;

var oFReader = new FileReader(),

rFilter = /^(?:image\/bmp|image\/cis\-cod|image\/gif|image\/ief|image\/jpeg|image\/jpeg|image\/jpeg|image\/pipeg|image\/png|image\/svg\+xml|image\/tiff|image\/x\-cmu\-raster|image\/x\-cmx|image\/x\-icon|image\/x\-portable\-anymap|image\/x\-portable\-bitmap|image\/x\-portable\-graymap|image\/x\-portable\-pixmap|image\/x\-rgb|image\/x\-xbitmap|image\/x\-xpixmap|image\/x\-xwindowdump)$/i;

oFReader.onload = function(oFREvent) {

stage.removeChild(imgthis);

imgthis = new createjs.Bitmap(oFREvent.target.result);

//document.getElementById('show').src=oFREvent.target.result;

var image=new Image();

setTimeout(function(){

image.src=oFREvent.target.result;

console.log('img width:'+image.width+' img height:'+image.height)

var imgWidth=image.width;

var imgHeight=image.height;

var imgFaceWidth=imgWidth*elePos.w/100;

var imgFaceHeight=imgHeight*elePos.h/100;

var sizescale=448/imgFaceWidth/2;

scale=sizescale;

console.log('imgWidth:'+imgWidth+';elePos.w:'+elePos.w+';scale:'+sizescale);

/*图片初始位置*/

var fx=360/2;

var fy=152/2;

/*注:上传图片,放大缩小倍数需要除以2;设计稿中头像左上角,距内容区左上角距离,依然也需要除以2(横坐标除以2,纵坐标除以2)*/

console.log(fx,fy);

elePos.s=sizescale;

elePos.x=fx;

elePos.y=fy;

imgthis.scaleX =sizescale, imgthis.scaleY = sizescale, imgthis.rotation = elePos.a, imgthis.x = fx, imgthis.y = fy;

stage.addChild(imgthis);

stage.swapChildren(bg, imgthis);

stage.update();

},200)

};

② 调整图片位置大小

/*上传图片的初始位置 放大倍数及旋转角度*/

var elePos = {

x: 80,

y: 500,

s: 1,

a: 0,

w:100,

h:100

}

var scale = 1,

angle = 0,

gestureArea = document.getElementById('gesture-area'); //手势区域

var stageplay=1;

/*调整图片位置*/

interact(gestureArea).gesturable({

onstart: function(event) {

},

onmove: function(event) {

if (typeof imgthis == 'undefined') {

return;

}

scale = scale * (1 + event.ds);

angle += event.da;

x = (parseFloat(elePos.x) || 0) + event.dx, y = (parseFloat(elePos.y) || 0) + event.dy;

elePos.x = x;

elePos.y = y;

elePos.s = scale;

elePos.a = angle;

imgthis.scaleX = elePos.s, imgthis.scaleY = elePos.s, imgthis.rotation = elePos.a, imgthis.x = elePos.x, imgthis.y = elePos.y;

stage.update();

},

onend: function(event) {}

}).draggable({

onmove: dragMoveListener

});

function dragMoveListener(event) {

if (typeof imgthis == 'undefined') {

return

}

x = (parseFloat(elePos.x) || 0) + event.dx, y = (parseFloat(elePos.y) || 0) + event.dy;

s = (parseFloat(elePos.s) || 1), a = (parseFloat(elePos.a) || 0);

imgthis.scaleX = elePos.s, imgthis.scaleY = elePos.s, imgthis.rotation = elePos.a, imgthis.x = elePos.x, imgthis.y = elePos.y;

elePos.x = x;

elePos.y = y;

console.log('*************'+elePos.x)

console.log('*************'+elePos.y)

stage.update();

}

③ 输入文字

④生成图片(生成的图片包括已有的背景+上传调整后的照片+输入的文字)

// 生成图片

document.getElementById('upload').onclick = function() {

var getCanvas = document.getElementById('demoCanvas');

var context=getCanvas.getContext('2d');

var inputwd = document.getElementById('inputwd').value;

var inputimg = document.getElementById('inputimg').value;

if(inputwd != '' && inputimg!=''){

context.font='24px 微软雅黑';

context.textAlign='center';

context.textBaseline='middle';

context.fillStyle='#333';

context.fillText('我爱',158,18);

context.fillText(inputwd,458,18);

document.getElementById('content1').style.display='none';

document.getElementById('content2').style.display='block';

var imgDatadahe = getCanvas.toDataURL().replace("image/png", "image/octet-stream");

document.getElementById('show').src=imgDatadahe;

console.log('imgDatadahe:'+imgDatadahe);

}else{

alert('请上传图片,为相框起个昵称,例如:童话相框~~~');

}

}

DEMO演示

五、注意事项:

① 运行终端必须支持Canvas

② 性能消耗过大。尤其是在移动端,很容易造成崩溃。解决办法:设定最大宽度,将图片等比缩放,减少损耗。

其实实现方法还有很多种,比如用原生JS操作Canvas + HammerJS操作图片,感兴趣的小伙伴可以多研究一下,因篇幅问题,小五就不过多详述了~~~

html5 图片合成,H5案例分享:图片合成相关推荐

  1. html5 精灵动画,H5案例分享:CreateJs-EaselJS精灵Sprite类和简明动画

    CreateJs-EaselJS精灵Sprite类和简明动画 一.EaselJS中Sprite类 EaselJS精灵Sprite类是用spritesheet实例显示一个帧或帧序列(即动画).精灵片是一 ...

  2. H5案例分享—你的数学是语文老师教的吗?

    教育类H5游戏已经被广泛应用,很多教育软件都采用H5游戏形式向玩家传递知识,金豆微游戏为大家倾情奉献H5数学游戏,测一测你的数学能力有多高,众多的数学算术题,你能答对几题呢,赶紧来挑战一下吧! 游戏需 ...

  3. html5源码 母亲节,母亲节H5:非常有创意的5款母亲节H5案例分享

    节日类 有些事情是无法用言语表达的,就比如对母亲的爱,我相信很少有人会经常对母亲说:我爱你,这也是因为国人太过于腼腆的原因.既然没办法用言语来表示对母亲的爱,或许下面这些母亲节H5案例是一个不错的表达 ...

  4. html验证码图片,js+h5 canvas实现图片验证码

    本文实例为大家分享了js+h5 canvas实现图片验证码的具体代码,供大家参考,具体内容如下 实现效果 一.使用技术 原生js技术+html5 canvas画图 利用Math.random()函数随 ...

  5. android+怎么分享图片大小,Android微信分享图片大于32k进行压缩

    微信分享视频的时候,需要传一个图片数组,大小不能大于32k. 解决方案:使用Bitmap自带的compress方法解决了这个问题. 源码如下: package com.example.test; im ...

  6. android微信分享图片压缩,Android微信分享图片按质量压缩的解决方案

    一.杂谈 微信分享图片的迷之bug,前一阵子接盘一个Hybrid App,分享要用原生的分享,搞了一阵子把微信分享搞上,测试又反馈了一个谜一样的Bug,我这边看Log打印了checkArgs fail ...

  7. 移动端 html5领奖页面,H5案例|穿上领奖服,见证我的荣耀时刻

    原标题:H5案例|穿上领奖服,见证我的荣耀时刻 H5三大新风尚:人脸融合.重力感应.场景布置.今天的H5案例来自最新的人脸融合技术,更多精彩案例关注无非创意微信公众号:wufaecy 一.穿上领奖服, ...

  8. html遮罩效果mask,H5案例分享:特殊形状图片之遮罩蒙版CSS3-Mask效果

    特殊形状图片之遮罩蒙版CSS3-Mask效果 小五最近做的项目,需要一个小效果,就是获取用户头像以心形的形状展现在页面上,开始小五想的实现方式是canvas画图或CSS3的clip(剪切),发现都不理 ...

  9. html如何清理缓存图片,H5案例分享:js、css和图片等静态文件更新时如何避免浏览器缓存...

    在做web项目的中,我们不可避免的会引入一些css.js和图片等文件,但是更新文件后,却经常出现因浏览器缓存问题,导致即使更改了代码或者图片,但是在浏览器上访问的时候却没有发生变化,这是因为现在大多数 ...

  10. H5案例分享:html5移动开发细微之美

    html5移动开发细微之美 1.H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="width=dev ...

最新文章

  1. Java设计模式-建造者模式 理论代码相结合
  2. 转移指令jmp和跳转指令call
  3. torch将多个tensor张量合并为一个张量,只提高迷你批次的纬度
  4. 使用thead,tbody,tfoot来实现表格的分页打印
  5. Java线程池—ThreadPool简介
  6. 怎么用xmind整理我们获取的杂乱的信息
  7. (day 49 - 另起数组牺牲空间换取时间 ) 剑指 Offer 66. 构建乘积数组
  8. Chrome 谷歌浏览器安装Axure插件
  9. Matlab之全局变量
  10. canon iPF 系列保养墨盒清零方法
  11. Windows 10搭建SVN服务器
  12. android落花效果 字体渐变,落花有情 亲花有趣
  13. bootstrap 5 表单验证
  14. Crackme之Acid burn.exe
  15. 小猿圈Java讲师分享开发9年Java进阶大全
  16. Qt qlabel怎样实现透明
  17. LL(1)语法分析器
  18. format转换方法
  19. OSChina 周五乱弹 ——论HR的日常心塞
  20. 【STM32+cubemx】0030 HAL库开发:DDS芯片AD9833实现简单的波形发生器

热门文章

  1. 湖南出台不动产登记新规 “小产权房”不予办理
  2. Word控件Spire.Doc 转换教程(十六):在 C# 中将 Word 转换为 PDF/A
  3. php中根据数字月份返回月份的英文缩写
  4. 迭代期望和方差(iterated expectation,variance)
  5. 批量修改pdf文件名称(一)
  6. 如何用python画房子_用python画一个小房子
  7. 彩色西装 来一整套·都市周报
  8. ASP.NET 系列_01_Web Pages 教程
  9. 微信支付--预支付(统一下单)
  10. 问题 K: [入门OJ]开会时间(初中生请多多指教)