javascript canvas - 检查是否加载了使用 toDataURL() 创建的图像

标签 javascript image canvas todataurl

我正在将图像加载到我的 albImg 数组中。

在我的循环中我这样做:

    for(var j = 1; j < albImg.length; j++){
        if(albImg[j].complete == true && albImg[j].width > 0){
            loadedimages++;
        }
    }

确保我的所有图像均已加载。 然后我像这样调用我的 FlipImg() 函数:

    if(loadedimages == albImg.length-1){
         flipImg();
    }

然后我翻转图像并

ctx2.save();
ctx2.scale(-1, 1);
for (var i = RszSpriteCount; i < sprites.length; i++) {
    ctx2.drawImage(albImg[sprites[i][0]], sprites[i][1], sprites[i][2], sprites[i][3], sprites[i][4], 0 - (sprites[i][1] + sprites[i][3]), sprites[i][2], sprites[i][3], sprites[i][4]);
}
ctx2.restore();
var flipSz = albImg.length;
albImg[flipSz] = new Image();
albImg[flipSz].src = cnv2.toDataURL();

这就是我的问题开始的地方。

我创建的新图像 - albImg[5] - 在加载之前无法显示。 但它的创建就像已经加载一样。

也就是说:

albImg[5].width 在我可以显示之前已经设置(到 750)。 albImg[5].complete 在我可以显示之前设置为 true。 albImg[5].onload = ctx.drawImage(albImg[5], 0, 0);将在加载之前尝试绘制图像。

如何在显示翻转图像之前检查它是否确实已加载?在 JavaScript 中?

(由于具体情况我没有使用 jQuery)

请帮忙。

最佳答案

您的主要错误在于您如何设置 onload事件处理程序:

albImg[5].onload = ctx.drawImage(albImg[5], 0, 0)  

将设置返回值drawImage() ( undefined ) 到 onload听众。

你想要的是

albImg[5].onload = e => ctx.drawImage(albImg[5], 0, 0);  

albImg[5].onload = function(){ ctx.drawImage(this, 0, 0) };
<小时/>

对于completewidth属性设置为 true,这是因为虽然图像的加载始终是异步的,但在您的情况下,图像可能已经被 HTTP 缓存。
由于 HTTP 加载和 javascript 执行不是在同一个线程上执行的,因此 Image 可能在浏览器返回其属性之前实际加载。

但即便如此,onload 事件也会触发(最好将其设置在 src 之前)。

var cacher = new Image();
cacher.onload = function(){
  var img = new Image();
  img.onload = function(){
    console.log('"onload" fires asynchronously even when cached');
    };
  img.src = c.toDataURL();
  console.log('cached : ', img.complete, img.naturalWidth);
  }
cacher.src = c.toDataURL();
console.log('before cache :', cacher.complete, cacher.naturalWidth);
<canvas id="c"></canvas>

因此,在处理新图像(不是 html 标记中的图像)时,总是简单地听它的 onload事件。

<小时/>

现在,根据您在问题中提供的少量信息,您似乎甚至不需要这些图像,也不需要处理它们的任何加载(当然 Sprite 除外),因为您可以直接和同步调用ctx.drawImage(CanvasElement, x, y) .

const ctx = c.getContext('2d');
ctx.moveTo(0, 0);
ctx.lineTo(300, 75);
ctx.lineTo(0, 150);
ctx.fillStyle = 'rgba(120,120,30, .35)';
ctx.fill();

const flipped = c.cloneNode(); // create an offscreen canvas
const f_ctx = flipped.getContext('2d');
f_ctx.setTransform(-1, 0,0,1, c.width, 0);// flip it
f_ctx.drawImage(c,0,0);// draw the original image

// now draw this flipped version on the original one just like an Image.
ctx.drawImage(flipped, 0,0);
// again in 3s
setTimeout(()=>ctx.drawImage(flipped, 150,0), 3000);
<canvas id="c"></canvas>

关于javascript canvas - 检查是否加载了使用 toDataURL() 创建的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44750831/

相关文章:

javascript - 在 React 中发布数据

javascript - 安培 : Scroll to id by Select change value?

javascript - 在 jQuery 中将所有 <td>content</td> 替换为 <li>content</li>

java - 从 Java (JFrame) 包中加载图像

javascript - 如何用 JavaScript 编写这个基本的 PAINT 语句?

html - Chart.js Canvas 调整大小

javascript - 我正在将项目插入数组,但脚本变得无响应?

java - 将文本内容转换为图像

javascript - 是否可以在页面其他部分加载后克隆图像而不加载?

css - 将 HTML 文本与 Canvas 混合