gpt4 book ai didi

javascript - 将一 block Canvas 转换为 blob 类型

转载 作者:行者123 更新时间:2023-12-03 08:52:01 26 4
gpt4 key购买 nike

我正在尝试优化一些使用 canvas.drawImage() 调用的代码。当调用数百或数千次时,这是一个相当昂贵的调用。发现了 canvas.toBlob(callback) 方法,但我想知道是否有办法只获取 Canvas 的一部分。

drawimage() 对应绘制的部分提供了更精细的控制。

canvas.drawImage(canvas, sx, sy, sw, sh, dx, dy, dw, dh);

欢迎任何建议/想法!

最佳答案

目前仅 Firefox 浏览器支持 canvas.toBlob 方法。
要使其在其他浏览器上运行,您可以使用 this code将 base64 dataURI 转换为 blob 对象。

现在,要通过这些方法仅获取 Canvas 的一部分,您必须创建一个新 Canvas ,将其尺寸设置为裁剪后的尺寸,然后在其上绘制所需的部分:

var img = new Image();
img.crossOrigin = 'anonymous';
img.src = "http://i.imgur.com/fHyEMsl.jpg";

var resultImg = new Image();
var resultSize = document.createElement('span');
document.body.appendChild(resultImg);
document.body.appendChild(resultSize);

var cropped = {x: 0, y: 0, width: 130, height: 130};

var canvas = document.createElement('canvas');
document.body.appendChild(canvas);

img.onload = function() {
canvas.width = this.width;
canvas.height = this.height;
canvas.getContext('2d').drawImage(this, 0, 0);
setInterval(cropCanvas, 1000);
}

function cropCanvas() {
URL.revokeObjectURL(resultImg.src);
var newCanvas = document.createElement('canvas');
newCanvas.width = cropped.width;
newCanvas.height = cropped.height;
newCanvas.getContext('2d').drawImage(canvas, -cropped.x, -cropped.y);
if (newCanvas.toBlob) { // Firefox
newCanvas.toBlob(function(blob) {
resultImg.src = URL.createObjectURL(blob);
resultSize.innerHTML = blob.size + ' bytes';
}, 'image/jpeg');
} else { // all other browsers
var blob = dataURItoBlob(newCanvas.toDataURL('image/jpeg'));
resultImg.src = URL.createObjectURL(blob);
resultSize.innerHTML = blob.size + ' bytes';
}
//move our crop
if (cropped.x < img.width - 130)
cropped.x += 130;
else {
if (cropped.y < img.height - 130) {
cropped.y += 130;
cropped.x = 0;
} else {
cropped.x = 0;
cropped.y = 0;
}
}
}

// taken from https://stackoverflow.com/questions/4998908/convert-data-uri-to-file-then-append-to-formdata/5100158#5100158
function dataURItoBlob(dataURI) {
var byteString;
if (dataURI.split(',')[0].indexOf('base64') >= 0)
byteString = atob(dataURI.split(',')[1]);
else
byteString = unescape(dataURI.split(',')[1]);

var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];

var ia = new Uint8Array(byteString.length);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}

return new Blob([ia], {
type: mimeString
});
}

关于javascript - 将一 block Canvas 转换为 blob 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32639839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com