最近做的APP项目涉及到手机拍照上传图片,因为手机拍照的图片通常都比较大,所以上传的时候就会很慢。为此,需要对图片进行压缩处理来优化上传功能。以下是具体实现:
/* 
 * 图片压缩
 * img 原始图片
 * width 压缩后的宽度
 * height 压缩后的高度
 * ratio 压缩比率 
 */
 function compress(img, width, height, ratio) { 
 var canvas, ctx, img;
 
 canvas = document.createElement('canvas'); 
 canvas.width = width;
 canvas.height = height;
 
 ctx = canvas.getContext("2d"); 
 ctx.drawImage(img, 0, 0, width, height);
 
 img = canvas.toDataURL("image/jpeg", ratio);
 
 return img;
 }上面是一个图片压缩函数,返回 base 格式的图片数据。 其中压缩比率取值(0 - 1 之间)越大图片质量越高。建议不要将图片转为 png 格式,因为转为 png 格式,图片的 base 比转为 jpeg 的要长不少。下面是实际调用:
var image = new Image();
image.src = "/img/test.jpg";
 
image.onload = function(){
 var img = compress(image, 500, 400, 0.7);
 document.getElementById("test").src = img;
}注意: 压缩方法的调用以及图片src赋值必须放在图片的 onload 方法里面。因为只有等图片加载完成后才能进行压缩处理,从而转换为base 进行赋值。 如果放在 onload 方法外面,则可能压缩代码无效,或者会生成一张纯黑色的图片。
下载本文