gpt4 book ai didi

javascript - 多个图像的 context.drawImage 最终导致 FireFox 崩溃

转载 作者:搜寻专家 更新时间:2023-10-31 21:47:38 25 4
gpt4 key购买 nike

我正在创建一个应该能够接受至少 1000 张图像的图像 uploader 。用户选择/拖放图像后,应显示图像以供预览。然后,用户将点击上传按钮开始上传。

我已经实现了全部功能,它在 Chrome 上运行起来非常棒。但这在 Firefox 中失败了。

我创建了一种排队机制,一旦用户选择图像,在某个时间点只有 n 个图像会被加载到浏览器中。

超过 20 张图像也会发生崩溃(即使使用排队机制创建一批 1 张图像)。我在 Firefox 中使用选项卡内存使用插件(http://mybrowseraddon.com/tab-memory.html)检查了内存使用情况。它甚至会因为 40 MB 的内存使用而崩溃。所以我想,这不是因为任何内存泄漏。

function readAndDisplay(file, index){
id = getFileId(file);
reader = new FileReader();

reader.onload = function (e) {
addImageCard(file, index);
resizeImage(e, index);
delete this;
//$('#image' + id).attr('src', e.target.result);

}

reader.readAsDataURL(file);
}

function resizeImage(fileReaderEvent, index){

var img = new Image();
img.onload=function(){
var MAX_WIDTH = 800;
var MAX_HEIGHT = 600;
var width = img.width;
var height = img.height;

if (width > height) {
if (width > MAX_WIDTH) {
height *= MAX_WIDTH / width;
width = MAX_WIDTH;
}
} else {
if (height > MAX_HEIGHT) {
width *= MAX_HEIGHT / height;
height = MAX_HEIGHT;
}
}
var canvas = document.getElementById("image" + index);
var ctx = canvas.getContext("2d");
canvas.width = width;
canvas.height = height;
ctx.drawImage(img, 0, 0, width, height);

img.src = "";
delete canvas;
delete ctx;
img = null;
delete fileReaderEvent;

uploadQueue.push(index);
if(loadImageIterator < updatedFiles.length){
loadImage(updatedFiles[loadImageIterator++]);
}
else{
updatedFiles = [];
}

}
img.src = fileReaderEvent.target.result;
var md5 = CryptoJS.MD5(fileReaderEvent.target.result).toString();
console.log(md5);
}

function addImageCard(file, index){

imageHolder = $("#imageholder");

imageCard = $("<div>", {
class: "col m1 s4",
id: "card" + index
});

innerDiv = $("<div>", {
class: "card"
});

cardImage = $("<div>", {
class: "card-image",
}).append($("<canvas>", {
id: "image" + index,
css: {
width: "100%"
}
//src: "images/sample-1.jpg"
})).append($("<span>", {
class: "card-title",
text: ""
}));

cardContent = $("<div>",{
class: "card-content",
html: "<p>" + file.name + "</p>"
});

cardAction = $("<div>", {
class: "card-action"
});

removeButton = $("<a>", {
title: "Remove",
css: {
"font-size": "20px"
},
click: function(){
remove(index)
}

}).append($("<span>", {
class: "glyphicon glyphicon-remove-circle"
}));

uploadButton = $("<a>", {
title: "Upload Now",
css: {
"font-size": "20px",
float: "right",
"margin-right": "4px"
}

}).append($("<span>", {
class: "glyphicon glyphicon-cloud-upload"
}));

cardAction.append(removeButton);
cardAction.append(uploadButton);

innerDiv.append(cardImage);
innerDiv.append(cardContent);
innerDiv.append(cardAction);
imageCard.append(innerDiv);
imageHolder.append(imageCard);

}

当我评论以下代码时,Firefox 不会崩溃 ctx.drawImage(img, 0, 0, 宽度, 高度)

到目前为止,我认为问题出在这个 drawImage 上。可能 drawImage 的实现在 Chrome 和 Firefox 中是不同的,我使用它的方式使它在 Chrome 中工作,但在 Firefox 中,它会抛出错误。

有没有人对为什么会发生这个问题有任何具体的想法?

JSFiddle- http://jsfiddle.net/sanchit235/7xh1gbj6/

Firefox 崩溃报告- https://crash-stats.mozilla.com/report/index/6107c530-12a1-4aea-96c9-0366c2151010

最佳答案

您的代码中存在一些问题:

  • 第一个是你同步调用了loadImage()FileSelectHandler() 的 for 循环中(onchange) 本身回调 loadImage()如果循环未完成,则在绘图完成后异步(在我的 comp 上,20 张图像出现 15 次)。
    仅在 onchange 上调用一次并让异步回调就足够了。

  • 第二个正在检查回调:
    if(loadImageIterator < updatedFiles.length){
    loadImage(updatedFiles[loadImageIterator++]);
    }

    应替换为
    if(++loadImageIterator < updatedFiles.length){
    loadImage(updatedFiles[loadImageIterator]);
    }

    或者第一个电话将通过 updatedFiles[0] .

  • 第三个是您的变量声明。你忘了 var之前 reader , newFile和其他一些,创建这些全局变量。

这是 corrected fiddle这不会在 Chrome 或 FF 中引发任何错误,而不会自行删除任何内容。

关于javascript - 多个图像的 context.drawImage 最终导致 FireFox 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33053444/

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