2012-03-01 58 views
4

我正在构建一些使用processing.js处理从用户计算机拖动到canvas元素中的JPEG图像的东西。目前,它的工作原理是这样:Processing.js中的动态图像加载

canvas.addEventListener("dragenter", dragEnter, false); 
canvas.addEventListener("dragexit", dragExit, false); 
canvas.addEventListener("dragover", dragOver, false); 
canvas.addEventListener("drop", drop, false); 
... 
function drop(evt) { 
... 
    var files = evt.dataTransfer.files; 
    handleFiles(files); 
} 
function handleFiles(files) { 
    var file = files[0]; 
    reader = new FileReader(); 
    reader.onloadend = handleReaderLoadEnd; 
    reader.readAsDataURL(file); 
} 
function handleReaderLoadEnd(evt) { 
    var p=Processing.getInstanceById('canvas'); 
    p.setImage(evt.target.result); 
} 

...在JS,那么在连接到画布(<canvas datasrc="/assets/draw.pjs" id="canvas" width="978" height="652">)的.pjs脚本:

PImage imported_image; 
void setImage(s) { 
    imported_image = requestImage(s , "" , image_loaded_callback()); 
} 

所有工作正常为止。现在的问题:我会认为在图像准备好呈现时,会发生requestImage(或loadImage)的回调。但是,如果我这样做:

void image_loaded_callback() { 
    image(imported_image, 0, 0); 
} 

没有呈现。我可以通过等待10帧然后渲染来解决问题,但这似乎是一个非常丑陋(也许不可靠)的解决方案。有没有更好的方法来做到这一点? 任何帮助非常感谢!

+0

''PImage imported_image;''。这是什么? JavaScript不是Java,没有静态类型。 – 2012-03-03 15:25:58

+1

这部分在Processing.js中。请参阅http://processingjs.org/reference/PImage/ – BaronVonKaneHoffen 2012-03-04 19:50:12

回答

1

如果图片加载失败,回调将永远不会调用。 但imported_image.sourceImg指向真正的img元素,可能会有所帮助。您可以使用它来检测图像加载状态。例如:imported_image.sourceImg.complete ;imported_image.sourceImg.onerror;

+0

非常棒!假设这将有助于使我当前的解决方案等待几帧更可靠 - 至少代码将确切知道需要等待多少帧。 – BaronVonKaneHoffen 2012-05-18 12:02:39

0

实际上,我发现这样做的最好方法是在绘制循环中检查图像的加载属性。所以:

void draw() { 
    if(imported_image != null) { 
     if(imported_image.loaded) { 
      image(imported_image,0,0,500,500); 
     } 
    } 
} 

不是回调,而是相同的最终结果。比@ DouO的sourceImg.complete有更多的财产运气。