javascript - Canvas 到数据 url 无法正常工作

标签 javascript html canvas data-url

我有一个函数,它接受一个 img 元素并返回一个数据 url。这像 7/10 次一样工作,并返回空白图像 3/10 次。我通过我的浏览器(chrome)查看创建的数据 url 并使用相同的图像,所以我知道这个函数正在返回损坏的图像。谁能找出原因?

function imgToDataURL(img) {
    var canvas = document.createElement('canvas');
    canvas.width = img.naturalWidth;
    canvas.height = img.naturalHeight;
    var c = canvas.getContext('2d');
    c.drawImage(img, 0, 0);
    dataurl = canvas.toDataURL();
    return dataurl;
}

$(function() {
    img = new Image();
    img.crossOrigin = '';
    img.onload = function() {
        newimg = new Image();
        newimg.onload = function() {
            document.body.appendChild(newimg);
        }
        newimg.src = imgToDataURL(img);
    }
    img.src = 'https://somedomain.s3.amazonaws.com/someimg.png';
});

此示例大部分时间都有效,但有时会以一个大的白色矩形而不是图像结尾。

最佳答案

使用 .drawImage 函数,您必须在绘制图像之前等待图像加载。 只有在浏览器加载图像后,您才能调用 imgToDataURL 函数。

像这样:

var image_sources = ["img1.png", "img2.png", "..."];

for(var i=0; i<image_sources.length; i++) {
    var new_img = document.createElement("img");
    new_img.onload = function() {
       imgToDataURL(this);
    };
    new_img.src = image_sources[i];
}

关于javascript - Canvas 到数据 url 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18829971/

相关文章:

javascript - Canva的编辑器使用了哪些技术

javascript - 关于 javascript-canvas 对象的问题(保存、转换、恢复)

javascript - 如何使用单个函数在 Canvas 上绘制多个图像?

javascript - $watch 函数没有被触发

javascript - 数据未从子组件刷新到父组件

html - 在 flexbox 布局中,交叉轴是否有 `flex-shrink: 0` 声明?

html - 使用 Bootstrap 进行电子邮件模板设计

javascript - 如何将 Ionic 输入类型文件设置为 Button

javascript - 甘特图 javascript 循环问题

javascript - 如何通过视频标签缓存整个视频文件以便以后离线播放?