最近接受的活中,有个需求,前端自动切一个长图。一般来说切图都是后端完成的,不过鉴于项目运行在手机端,对H5支持比较好,于是决定在前端完成切图工作。
一、准备。
首先是如果用H5实现的话,那么和图形相关的就是canvas画布了。然后去查阅相关属性方法,得到这么一些有用的方法。
- drawImage() 可以把img、video对象绘制到画布上。
- getImageData() 获取画布指定区域的像素数据集合。
- putImageData() 向画布上填充像素数据。
- toDataURL() 将canvas数据转化成dataurl。
二、流程。
了解了基本知识,现在开始着重实现。将图片进行切割的主要流程就是:
- 获取指定图片对象,并获取起相关必要信息(长宽高等)。
- 创建canvas对象,并将图片对象绘制到画布上。
- 建立循环,分块获取画布对象指定区域数据。
- 获取画布数据的同时,建立新的canvas对象,并将获取的数据写入到新画布上。
- 将填充数据的新canvas添加到原图片对象后面。
- 循环结束隐藏图片对象。
整个过程中,最需要注意的地方也就是同源策略。在canvas上绘制不同源图片后,是无法获取canvas上任何数据的!这个一定要注意。
三、实现
代码如下:
$(function () {
var sImg = $("img.popup").get(0); // 获取图片对象
var parNode = sImg.parentNode;
var cH = sImg.naturalHeight;
var cW = sImg.naturalWidth;
var sC = document.createElement("canvas"); // 创建画布
sC.width = cW;
sC.height = cH;
var sCtx = sC.getContext("2d");
sCtx.drawImage(sImg, 0, 0); // 将图片绘制到画布上
for(var y = 0; y < sC.height; y += 1200){
var c = document.createElement("canvas"); // 创建新的画布
c.width = cW;
c.height = 1200;
var imgData = sCtx.getImageData(0, y, cW, 1200); // 获取画布指定区域的数据
c.getContext("2d").putImageData(imgData, 0, 0); // 将数据写入新建的画布上
var img = new Image();
img.src = c.toDataURL("image/png"); // 将画布转化成dataurl数据
$(parNode).append(img);
}
$(sImg).hide();
})
最后
如果不是同源策略的问题,我想完全可以开发出web截图工具。