image - 加载图像并等待 image.complete 后再处理数据

标签 image base64 html5-canvas settimeout

这似乎是一个持续存在的问题,我认为很多人都想一劳永逸地弄清真相。

问题存在于链条

image = new Image();
image.src = imagePath;

然后暂停一下,等待 image.complete ,例如...

while(HHGimg.height == 0)

while(!image.complete)
{
     setTimeout(function(){ foo },100);
}

接下来是canvas转base64方法。

var canvas = document.createElement('canvas');                          
canvas.width = image.width;                                         
canvas.height = image.height;                                           
var canvasContext = canvas.getContext('2d');                            
canvasContext.drawImage(image, 0, 0, canvas.width, canvas.height);  
imageData = canvas.toDataURL('image/jpeg'); 

问题在于暂停以确保 image.complete 完成其工作并将有效对象传递到 Canvas 。

需要一种方法来确保暂停足以完成,而不会以停止脚本的循环结束(这个“while”方法似乎就是这样)

关于如何在继续之前等待有效图像的任何想法...

我的整个功能如下...

<script type="text/javascript">
    function imageFetch(imgpath, imgname)                                               
{
    imgdata = "";                                       
    image = new Image();                                                        
    image.src = imgpath + imgname;;                                             
    while(image.height == 0)
    {
            setTimeout(function(){imgdata = "";},100);                                                      
    }
    var canvas = document.createElement('canvas');                          
    canvas.width = image.width;                                         
    canvas.height = image.height;                                           
    var canvasContext = canvas.getContext('2d');                            
    canvasContext.drawImage(image, 0, 0, canvas.width, canvas.height);      
    imgdata = canvas.toDataURL('image/jpeg');                                                   
    return imgdata;                                                             
}
</script>

...但直到暂停以确保图像完全加载,一些返回只是“数据:”

现在交给你了。关于如何击败这个有什么想法吗?

最佳答案

只需使用 image.onload !您还需要认识到,只有来自同一域的图像才能转换为数据 URL。如果不是,您将遇到同源策略错误。此外,您的函数必须等待 image.onload 才能转换数据,因此您应该更改函数以接受回调。

您的代码应如下所示:

<script type="text/javascript">
    function imageFetch(imgpath, imgname, callback)                                               
    {
    var imgdata = "",                                       
    image = new Image();                                                        
    image.src = imgpath + imgname;
    var canvas = document.createElement('canvas');                                     
    var canvasContext = canvas.getContext('2d');                            
    image.onload = function (){                          
        canvas.width = image.width;                                         
        canvas.height = image.height;     
        canvasContext.drawImage(image, 0, 0, canvas.width, canvas.height);      
        imgdata = canvas.toDataURL('image/jpeg');
        callback(imgdata);
    }                          
    return;                                                          
}
</script>

然后像这样运行:

imageFetch("/", "random.jpg", function (imgData){
    console.log(imgData);
    // Do whatever you want with imgData here
});

我添加了 demo 。请注意,由于同源策略,我对图像使用了 base64 URL。托管在同一服务器和端口上的图像应该可以正常工作。

关于image - 加载图像并等待 image.complete 后再处理数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12126727/

相关文章:

jquery - 使用 jquery 显示不同尺寸的随机图像

php - 如何在 Laravel 上传之前压缩图像?

ios - 为什么swift 3中的base64图像呈现为白色?

javascript - 如何让球从 Canvas 上水平弹起

javascript - HTML5 Canvas - 在 Canvas 上绘图、保存上下文并稍后恢复

javascript - 图片显示中的浏览器依赖问题

java - 旋转图像,图像宽度和高度不均匀

c - C中的机器人访问API不起作用,为什么?

PostgreSQL - 如何将 Base64 图像字符串插入 BYTEA 列?

javascript - 用户在 HTML5 Canvas 应用程序中绘制的平滑锯齿状线条?