gpt4 book ai didi

javascript - Internet Explorer 9 有时会在 Canvas 上绘制空白图像

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:19:15 27 4
gpt4 key购买 nike

我有一个 Web 应用程序,它可以动态生成图像,然后使用 Canvas 在客户端上呈现它们(的一部分)——一般代码看起来像这样(简化)...

var width = ...
var height = ...
var img = new Image();
img.onload = function(){ // Set onload before setting image source ;)
var canvas = document.createElement("canvas");
canvas.setAttribute('width',width);
canvas.setAttribute('height',height);
var context = canvas.getContext("2d");
context.drawImage(this,0,0,width,height,0,0,width,height);
}
img.src = ...

在 firefox 和 chrome 中,这工作正常。在 IE9(有时是 IE10)中,这有时会导致出现空白图像。作为解决方法,我输入了...

var width = ...
var height = ...
var img = new Image();
img.onload = function(){
var canvas = document.createElement("canvas");
canvas.setAttribute('width',width);
canvas.setAttribute('height',height);
var context = canvas.getContext("2d");
window.setTimeout(function(){
context.drawImage(img,0,0,width,height,0,0,width,height);
}, 10); // 10 millisecond delay here seems to give IE time to make sure the image is actually ready
}
img.src = ...

显然,随机延迟让我感到紧张 - 我更想弄清楚为什么会这样。图像上是否有其他可以使用的事件类型/方法/属性?与图像/编码/传输方法一起发送的 http header 中是否可能存在导致此问题的内容?

由于在 Canvas 上绘制图像似乎经常让新用户感到困惑,因此搜索主要产生开发人员在 onload 方法之前设置源的实例。我能找到的最接近的其他问题/回复是:https://stackoverflow.com/a/15186350/470062

编辑:

我更新了示例以在开头包含宽度和高度定义

2013 年 4 月 29 日编辑:

10 毫秒的延迟并不总是足够的 - 我已经更改了代码来检查 Canvas 像素以确定是否绘制了任何东西 - 虽然这感觉像是一个丑陋的 hack - 我很想知道是否有更好的方法:

... snip - this is at the end of the image load callback..

if((navigator.appVersion.indexOf("MSIE")) >= 0){

function checkAndRedraw(){
context.clearRect(0,0,width,height);
context.drawImage(img, 0, 0, width, height);
var imageData = context.getImageData(0, 0, width, height),
data = imageData.data,
len = data.length;

for (var i = 0; i < len; i += 4){
if(data[i] || data[i+1] || data[i+2]){
scheduleRedraw = null; // prevent memory leak
return; // A pixel contained some non empty value so something was drawn - done.
}
}

scheduleRedraw();
}
var redrawHackTimeout;
function scheduleRedraw(){
window.clearTimeout(redrawHackTimeout);
redrawHackTimeout = window.setTimeout(checkAndRedraw, 500);
}

scheduleRedraw();
}
//END IE9 Hack

最佳答案

我在 IE9 中也有同样的问题,我必须做的也是:

            theImage = new Image();

theImage.onload = function() {
that = this;
setTimeout(function() {
that.onload2();
}, 100);
};


theImage.onload2 = function(){
#your old load function code
}

theImage.src = 'http://....';

我不明白为什么 ie9 在实际未加载或尚未在 Canvas 中“可用”时触发加载图像功能。它让我拔头发。

关于javascript - Internet Explorer 9 有时会在 Canvas 上绘制空白图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16192332/

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