JS调整图像大小然后保存调整大小的图像

时间:2015-06-29 14:21:54

标签: javascript html5 html5-canvas

我正在开发一款使用大型图像的JS游戏。我希望能够在游戏开始前(加载时)收缩它们以适应画布的大小。在线查看我发现调整图像大小的唯一方法是通过drawImage,但我注意到如果我通过drawImage缩小图像,性能将无法提高。即使缩小的图像应该画得更快。所以我写了这个脚本来预先调整图像大小,但似乎有问题。

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');

var resizeImage = function (img, newWidth, newHeight) {
    var image = new Image();
    var tempCanvas = document.createElement('canvas');
    var tempContext;

    tempCanvas.id = 'tempCanvas';
    tempCanvas.width = newWidth;
    tempCanvas.height = newHeight;
    tempCanvas.style.visibility = 'hidden';

    document.body.appendChild(tempCanvas);

    tempContext = tempCanvas.getContext('2d');
    tempContext.drawImage(img, 0, 0, newWidth, newHeight);
    image.src = tempCanvas.toDataURL("image/png");
    return image;
};

var img = new Image();
var resizedImg;
img.onload = function () {
    resizedImg = resizeImage(this, this.width / 4, this.height / 4);
    resizedImg.onload = function () {
        ctx.drawImage(resizedImg, 0, 0);
    }
};
img.src = "https://upload.wikimedia.org/wikipedia/en/3/39/Wakerlink.jpg";

我希望看到已调整大小的图像,但我什么也没得到。

2 个答案:

答案 0 :(得分:2)

问题在于使用外部(与脚本不在同一服务器上)图像以及toDataURL(),这是不允许的。因此错误消息:

Uncaught SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.

答案 1 :(得分:0)

tempCanvas.style.visibility = 'hidden';

这可能会给你带来问题。

我建议你制作一个相对定位的游戏包装div 然后添加这个绝对定位的画布,然后给它一个负的z-index,这样它就会在画布后面消失,但技术上仍然可见。

 <div style='position:relative'>
    <canvas id='forresize' style="z-index:-100;position;absoulte;top:0p;left:0px;">
    </canvas>
    <div id='wrapper' style='position:absolute;top:0px;left:0px;width:100%;height:100%;">
         Your game divs/elements here
    </div>
 </div>