利用canvas制作图片(可缩放和平移)+相框+文字
作者: 发布日期:2015-01-20 20:22:10
Tag标签:相框 文字 图片
公司一个售前问我能不能用H5做一个手机拍照,给相片添加相框和添加文字上传到服务器的功能,我当时一琢磨觉得可行,就利用空余时间做了一个demo,去掉了拍照和上传,如果以后有机会,会给补上,当然对于开发过webApp的朋友来做到这个很简单。下面来看代码
1,思路首先我们需要准备素材,一个相框和一个相片,然后我们要思考,只是把他们和并且就可以了吗?答案是否定的,我还需要对照片进行编辑,比如平移和缩放等。还要可以切换相框。
2,如何合并相框和图片?
上面是我的界面,从界面可以看出,我有三张图片和两个相框,最右边是相框和图片合并之后的结果。看代码:
html:
<style> body,html,ul,li,h3,h5,a,p,span,div{ margin: 0px; padding: 0px; } ul,li{ list-style: none; } .wrap{ position: relative; margin:40px; width: 1000px; height: 400px; background-color: #fff; box-shadow: 0px 0px 1px 1px #eee; } .imgWrap, .photoWrap{ width: 100px; height: 380px; float: left; border: 1px solid #ccc; margin:10px 40px 10px 40px; text-align: center; } .imgWrap img{ width: 60px; height: 100px; } .photoWrap img{ width: 90px; height: 140px; } .photoWrap_canvas{ position: absolute; /*opacity: 0.4;*/ width: 300px; left: 365px; height: 400px; /*background-color: red;*/ } </style> <div class='wrap'> <div class='photoWrap_canvas' id='photoWrap_canvas' > </div> <canvas id='myCanvas' width='300' height='400' style='background-color:#ccc'></canvas> <div class='photoWrap' id='photoWrap'> <ul> <li><img src='img/xk1.png' alt=''></li> <li><img src='img/xk2.png' alt=''></li> </ul> </div> <div class='imgWrap'> <ul> <li><img src='img/mm1.jpg' alt=''></li> <li><img src='img/mm2.jpg' alt=''></li> <li><img src='img/mm3.jpg' alt=''></li> </ul> </div> <div> <input type='text' id='txtKey'> <button id='btnAddFont'>输入</button> <button id='btnOk'>完成</button> <button id='btnReset'>还原</button> </div> </div>
js:
var _ = function(selector){return document.getElementById(selector);} var util = { isNull:function(str){return str == null || str.length == 0 } } var c = _('myCanvas'); var ctx = c.getContext('2d'); var ctxW = c.width, ctxH = c.height; var img = new Image(); img.src = 'img/mm2.jpg'; var imgW,imgH; img.onload=function(){ imgW = 300 || img.width, imgH = 400 || img.height; onDraw(); ctx.save(); } function onDraw(){ ctx.drawImage(img,0,0,300,400); } // 切换相册 $('.photoWrap').delegate('ul li img','click',function(){ var src = $(this).attr('src'); $('.photoWrap_canvas').css('background','url('+src+') no-repeat').css('background-size','100% 100%').attr('data-url',src); })看到上面的代码,很简单,
1,获取一个canvas标签,然后利用getContext('2d')获取到一个画布对象;
2,创建一个image对象,给它添加src属性
3,图片加载完毕使用 drawImage()把img对象画到canvas里面,
4,再给div.photoWrap的div添加背景图片,(通过给canvas添加一个透明的蒙层可以做一个切换相框的效果)
3,如何平移图片?
以上效果,通过移动鼠标来设置图片的位置。看代码:
// 移动相册的动作 var hasTouch = 'ontouchstart' in window; // console.log(window); var STA_EN = hasTouch ? 'touchstart' : 'mousedown', MV_EV = hasTouch ? 'touchmove':'mousemove', END_EV = hasTouch ? 'touchend' : 'mouseup', END_Cancel = hasTouch ? 'touchcancel' : 'mouseout'; _('photoWrap_canvas').addEventListener(STA_EN,start,false); _('photoWrap_canvas').addEventListener(MV_EV,move,false); _('photoWrap_canvas').addEventListener(END_EV,end,false); _('photoWrap_canvas').addEventListener(END_EV,end,false); var bStart = 0; var bginX,bginY,startX = 0,startY = 0; var offsetX_ctx = 0,offsetY_ctx = 0; function start(ev){ // console.log('32') ev.preventDefault(); bStart = 1; var poi = getEvtLocation(ev); // console.log(poi.x,poi.y); bginX = poi.x; bginY = poi.y; } function move(ev){ ev.preventDefault(); if(bStart === 0)return; var poi = getEvtLocation(ev); var offsetX = poi.x - bginX, offsetY = poi.y - bginY; ctx.translate(offsetX,offsetY); onDraw(); bginX = poi.x; bginY = poi.y; } function end (ev) { // body... ev.preventDefault(); bStart = 0; } function getEvtLocation(ev){ if(util.isNull(ev)) return; // var touch = ev.touches[0]; return{ x : ev.offsetX, y : ev.offsetY } }上面代码做了如下动作: