image - 火狐 : image base64 data using canvas object not working

标签 image firefox canvas base64

这是我编写的用于调整图像宽高比大小的代码,它可以在 chrome 上运行,但不能在 firefox 上显示,有谁知道出了什么问题。

var image = new Image();

        image.src = data;

        //$(image).load(function () {

            var aspectRatio = getAspectRatio(parseFloat($(image).prop('naturalWidth')),
                              parseFloat($(image).prop('naturalHeight')),
                              dstWidth,
                              dstHeight);

            var canvas = document.createElement('canvas');
            canvas.width = dstWidth;
            canvas.height = dstHeight;

            var x = (dstWidth - aspectRatio[0]) / 2;
            var y = (dstHeight - aspectRatio[1]) / 2;
            var ctx = canvas.getContext("2d");
                ctx.drawImage(image, x, y, aspectRatio[0], aspectRatio[1]);

            return canvas.toDataURL("image/png");

这是由canvas.toDataURL生成的工作

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQEAAADACAYAAAAEL9ZYAAAA1klEQVR4nO3BAQ0AAADCoPdPbQ8HFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwYD7QAB/UrDfgAAAABJRU5ErkJggg==

最佳答案

要使其正常工作,您需要处理图像加载的异步特性。您必须在这里使用回调机制。它在 Chrome 中“工作”的原因是偶然的;也就是说,当您尝试和/或浏览器能够在您在 drawImage 调用中使用图像之前提供未压缩/解码的图像时,图像恰好位于缓存中。

当大多数用户在线时,这可能不起作用,因此要正确处理加载,您可以这样做 -

示例:

function getImageUri(url, callback) {

    var image = new Image();
    image.onload = function () { // handle onload

        var image = this;  // make sure we using valid image

        var aspectRatio = getAspectRatio(parseFloat($(image).prop('naturalWidth')),
        parseFloat($(image).prop('naturalHeight')),
        dstWidth,
        dstHeight);

        var canvas = document.createElement('canvas');
        canvas.width = dstWidth;
        canvas.height = dstHeight;

        var x = (dstWidth - aspectRatio[0]) / 2;
        var y = (dstHeight - aspectRatio[1]) / 2;
        var ctx = canvas.getContext("2d");
        ctx.drawImage(image, x, y, aspectRatio[0], aspectRatio[1]);

        // use callback to provide the finished data-uri
        callback(canvas.toDataURL());
    }
    image.src = url; // set src last
}

然后这样使用它:

getImageUri(myURL, function (uri) {
    console.log(uri); // contains the image as data-uri
});

关于image - 火狐 : image base64 data using canvas object not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23075778/

相关文章:

javascript - Amazon S3 奇怪的 CORS 行为 : No 'Access-Control-Allow-Origin' header is present on the requested resource

python - 读取两个图像作为一个图像Python

html - 如何在不扭曲图像的情况下将图像放入固定大小的 div 中?

javascript - Angular 6 中的图像处理

Safari 中的 jquery 标签插入问题

css - Firefox 17 和基于 CSS 边框的三 Angular 形无法正确呈现

html - 为什么 Firefox 在加载 'big' 文档时比 Chrome 快得多?

javascript - 如何更改html5 Canvas 线的起点和终点位置?

基于 Canvas 的游戏的 JavaScript 缓冲 : mediocre performance

javascript - NS_ERROR_NOT_AVAILABLE : Component is not available