Canvas裁剪等比尺寸文章缩略图
作者:秋了秋 发表时间:2017年03月11日
通常来说,缩略图都是读取文章里面的一张大图片再通过css缩小显示,或者是后台经过处理后生成的另外一张对应的图片,这里不做讨论,我们是前端就得用前端的方法。然而图片大小不一会给前端响应式造成巨大的麻烦,关于响应式固定宽高比例前面一篇文章已经讲过一种方法《纯css自适应div高度(等比缩放)》,今天讲另外一种更高级的canvas办法。除了固定宽高比例,还实现了裁剪中心位置像素。然后用canvas代替img标签放于网页img原先位置或者输出dataurl形式的img地址。
原理是:页面默认不显示图片,把图片的src地址绑定到data-src上,注意一定要在同一个服务器的图片(本地也不行),然后通过js取到这个图片,内存中进行加载,加载完成,计算图片的裁剪宽高区域,然后生成一个canvas,把相应区域的图像绘制到canvas上,再把canvas插到页面中。


-
这是第一张图片裁剪后 -
这是第二张图片裁剪后 -
这是第三张图片裁剪后 -
这是默认图片裁剪后
参考html:
<div id="container"> <img data-src="3.png" id="img" /> </div>
参考js:
function cutImg(imgsrc,width,height,container,bgColor){
var count=0;
var defaultImg="/thumb/New_Project_copy-3069f937ed77449b8bf4b046d211b62a.png";//加载错误默认显示的图片
var img=document.createElement("img");
img.src=imgsrc;
var cvs=document.createElement("canvas");
cvs.width=width;
cvs.height=height;
var context=cvs.getContext('2d');
context.fillStyle=bgColor;
context.rect(0,0,width,height);
context.fill();
appendCvs(container);
function appendCvs(container){
if(typeof container == "object"){
container.html("").append(cvs);
}else{
var _container=document.querySelector(container);
_container.innerHTML="";
_container.appendChild(cvs);
}
}
var rate=width/height;
img.onload=function(){
var imgWidth=img.width,imgHeight=img.height;
var rate=imgWidth/imgHeight;
var dx,dy,sx,sy,cvsw=width,cvsh=height,cvsx=0,cvsy=0;
if(imgWidth <= width && imgHeight <= height){//宽高都小于canvas尺寸
dx=imgWidth,dy=imgHeight;
sx=0,sy=0;
if(rate > 1){
cvsw=width,cvsh=cvsw/rate;
cvsx=0,cvsy=(height-cvsh)/2;
}else{
cvsh=height,cvsw=cvsh*rate;
cvsy=0,cvsx=(width-cvsw)/2;
}
}else if(rate < 1){//宽度小于高度时
dx=imgWidth,dy=dx;
sx=0,sy=(imgHeight-dy)/2;
}else{//高度小于宽度时
dx=imgHeight,dy=dx;
sx=(imgWidth-dx)/2,sy=0;
}
context.drawImage(img, sx, sy, dx, dy, cvsx, cvsy, cvsw, cvsh);
//var dataImg=cvs.toDataURL("image/jpeg");
appendCvs(container);
}
img.onerror=function(){
count++;//防止图片一直加载不出来造成死循环
(count < 2) && cutImg(defaultImg,width,height,container,bgColor);
}
}
调用方式:
cutImg($("#img").attr("data-src"),200,200,"#container","#fff");//五个参数,第一个是要截取的源图片,第二个是canvas宽,第三个是高,第四个是最终放图片的容器,注意这个容器会被清空,第五个是canvas背景颜色。//往往会批量处理一组缩略图,只需要重复调用这个函数即可:$("#container .card").each(function(index,ele){
var imgSrc=$(ele).find("img").attr("src");
cutImg(imgSrc,200,200,$(ele).find(".card"),"#fff");
});
忘了说css,css很简单,设置canvas的宽度为100%即可,高度会按你设置的canvas宽高比例缩放。
1
文章作者: “秋了秋”个人博客,本站鼓励原创。
转载请注明本文地址:http://netblog.cn/blog/476.html