【问题标题】:Dynamic image loading in Processing.jsProcessing.js 中的动态图像加载
【发布时间】:2012-03-01 23:05:43
【问题描述】:

我正在构建一些东西,它使用 processing.js 对从用户机器拖到画布元素中的 JPEG 图像进行操作。目前,它的工作方式如下:

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 帧然后渲染来解决这个问题,但这似乎是一个非常丑陋(并且可能不可靠)的解决方案。有没有更好的方法来做到这一点? 非常感谢任何帮助!

【问题讨论】:

标签: javascript canvas processing processing.js loadimage


【解决方案1】:

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

【讨论】:

  • 太棒了!假设这将有助于使我当前等待几帧的解决方案更加可靠 - 至少代码将确切地知道它需要等待多少帧。
【解决方案2】:

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

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

不是回调,而是相同的最终结果。该属性比@DouO 的sourceImg.complete 更幸运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2015-01-12
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多