gpt4 book ai didi

javascript - Canvas 甚至 Img 吃 RAM 和 CPU

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:50:26 25 4
gpt4 key购买 nike

我正在获取掉落在该区域的文件列表。然后获取他们的 dataUrl 并将它们放入 Img 中。然后使用 drawImage 将该图像放入 Canvas 中。我根据图像的大小对图像进行适当的缩放。它运行正常。但问题是即使在操作完成后。例如在 Canvas 被附加到 dom CPU 之后很久,内存使用率就很高了。只是为了显示 Canvas ,它需要高 CPU 和内存。

放置事件中的代码:

    e.preventDefault();
$("#controller_search").attr('value', '^')
$("#controller_search").attr('disabled', 'disabled');
$("#imageList").html('');
var templateData = "\
<div class='imageviewer-up'> \
<div class='curtain'></div> \
<canvas class='canvas'></canvas> \
<div class='loading'>0%</div> \
</div> \
";
for(var i=0;i<event.dataTransfer.files.length;++i){
var file = event.dataTransfer.files[i];
var reader = new FileReader();
reader.onload = (function(file){
return function(e){
var template = $(templateData);
var image = new Image();/*template.find('img')[0];*/
image.onload = (function(image){
return function(){
var size = {height: image.height, width: image.width}
var rSize = size;
if(size.height > 175)
rSize = {height: 175, width: (175*size.width)/size.height}
else{
rSize = {height: 175/(size.width/size.height), width: size.width/(size.width/size.height)}
}
image.height = rSize.height;
image.width = rSize.width;

var canvas = template.find('canvas')[0];
var context = canvas.getContext("2d");
context.mozImageSmoothingEnabled = true;
canvas.height = 175+4;
canvas.width = image.width+4;
context.drawImage(image, (canvas.height-image.height)/2, 2, image.width, image.height);

template.css('height', 175+4+0);
template.css('width', image.width+0);

}
})(image)
image.src = e.target.result;
image.title = file.name;
console.log(file.name);
$("#imageList").append(template);
image = null;
}

})(file);
reader.readAsDataURL(file);
}

目前,我正在通过拖动 20 张图像(总计最大 45 MB)进行测试,以便创建 20 张 Canvas 。是不是太多了?

编辑

我什至使用 IMG 而不是 Canvas 进行了测试。例如仅将 IMG 与 dataUrls 一起使用。但这种方式也是。以同样的方式减速。那么我的代码中是否存在内存泄漏?

最佳答案

我认为这是关于 chrome 的问题 bug#36412 data: url 正在占用内存但未释放内存。这就是导致潜在问题的原因。我使用 window.URL.createObjectURL 修复了它和 window.URL.revokeObjectURL .对于 webkit,它的 window.webkitURL 代替。现在即使有 30 多张图片也能正常工作。当前代码如下:

for(var i=0;i<event.dataTransfer.files.length;++i){
var file = event.dataTransfer.files[i];
var total = event.dataTransfer.files.length;
var template = $(templateData);
var image = new Image();/*template.find('img')[0];*/
image.onload = (function(image, template, i){
return function(e){
/* Size adjustment */
var canvas = template.find('canvas')[0];
var context = canvas.getContext("2d");
context.drawImage(image, (canvas.height-image.height)/2, 2, image.width, image.height);
window.URL.revokeObjectURL(this.src);
}
})(image, template, i)
image.src = window.URL.createObjectURL(file);
bong.upload.files.push(file);
$("#imageList").append(template);
image = null;
}

关于javascript - Canvas 甚至 Img 吃 RAM 和 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8204049/

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