使用画布调整多个图像大小

时间:2014-02-03 16:12:14

标签: javascript html5-canvas

我已经构建了一个拖放图像上传器。 我想自动创建每个图像的缩略图。 我使用的是html5画布,但是当我一次上传20个或更多的2MB图像时,浏览器(safari)会崩溃。当我离开调整大小功能时,一切正常。 有关如何处理这个的任何建议?非常感谢你!

这是在每个图像上调用的resize函数:

if(this.hasFileReader){
    var reader = new FileReader();
    reader.readAsDataURL(this.file);
    var file = this.file;
    reader.onloadend = function(e){
        var tempImg = new Image();
        tempImg.src = reader.result;
        tempImg.onload = function() {

            var MAX_WIDTH = 348;
            var MAX_HEIGHT = 300;
            var tempW = tempImg.width;
            var tempH = tempImg.height;
            if (tempW > tempH) {
                if (tempW > MAX_WIDTH) {
                   tempH *= MAX_WIDTH / tempW;
                   tempW = MAX_WIDTH;
                }
            } else {
                if (tempH > MAX_HEIGHT) {
                   tempW *= MAX_HEIGHT / tempH;
                   tempH = MAX_HEIGHT;
                }
            }

            var canvas = document.createElement('canvas');
            canvas.width = tempW;
            canvas.height = tempH;
            var ctx = canvas.getContext("2d");
            ctx.drawImage(this, 0, 0, tempW, tempH);
            var dataURL = canvas.toDataURL("image/jpeg");

            var xhr = new XMLHttpRequest();
            xhr.open('POST', 'uploadResized.php', true);
            xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            var data = 'image=' + dataURL + '&name=' + file.name + '&type=' + file.type;
            xhr.send(data);
        }
}

1 个答案:

答案 0 :(得分:1)

您正在为批次中的每个图像创建一个新的画布元素,并且画布很昂贵。

相反,在循环外部执行`var canvas = document.createElement('canvas')。

这样只创建了1个canvas元素而不是很多。

BTW,当您在循环中执行canvas.width = tempW时,您的画布会自动清除,因此您无需添加clearRect。