在 JavaScript 中使用 Processing 的 loadImage

Using Processing's loadImage in JavaScript

我正在使用 Processing API 将图像绘制到我的 HTML canvas,稍后我可以在代码中使用它。我的 JavaScript 代码是:

var sketchProc = function(processingInstance) {
  with (processingInstance) {

    /* @pjs preload="images/hot-air.png" */

    size(innerWidth, innerHeight);
    var testImage = loadImage("images/hot-air.png");

    draw = function() {
      image(testImage, 0, 0, 500, 500);
    }
  }
}

var canvas = document.getElementById("canvas");
var processingInstance = new Processing(canvas, sketchProc);

控制台显示图像的尺寸为 0x0。我尝试使用 Processing's directives 加载,但我仍然得到 0x0 的图像尺寸。但是,当我在绘图循环中调用 loadImage() 时,程序识别出图像的尺寸为 512x512。

我不想在绘图循环中连续调用 loadImage()。我应该怎么做才能确保图像在绘制循环之外正确加载?

您可以找到一个最小的工作示例 here

首先,感谢您发布 MCVE 让我们一起玩。

我认为问题在于,出于某种原因,preload 指令,也许 loadImage() 函数本身,在您编写 JavaScript-only Processing.js code 时不起作用。我已经在 Processing.js.

的各种编辑器和版本中对此进行了测试

所以看来要使用 loadImage() 函数,您应该使用 pure Processing code. Here 是一个 CodePen,展示了您将如何做到这一点:

<script type="application/processing">
    /* @pjs preload="https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/1200px-Cat03.jpg"; */
    PImage testImage;

    void setup(){
      size(500, 500);
      testImage = loadImage("https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/1200px-Cat03.jpg");
      println(testImage.height);
    }

    void draw() {
      background(100);
      image(testImage, 0, 0, 250, 250);
    }
</script>
<canvas> </canvas>

只是为了比较,here 是使用 JavaScript-only 语法的相同代码。这行不通。

但退一步说:如果您习惯使用 JavaScript,那么为什么要使用 Processing.js? Processing.js 专为希望编写自动转换为 JavaScript 的 Java 语法的 Processing (Java) 开发人员而设计。此时 Processing.js 已经很老了,不再维护。

相反,我建议使用 P5.js。 P5.js 允许您编写 Java 脚本语法来创建网络优先处理草图。 P5.js 更新很多,仍在积极开发中。

这是 P5.js 中的相同代码:

var testImage;

function preload(){
  testImage =  loadImage("https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/1200px-Cat03.jpg");
}

function setup() { 
  createCanvas(400, 400);
} 

function draw() { 
  background(100);
  image(testImage, 0, 0, 250, 250);
}

无耻的自我推销:我写了一篇关于 Processing、Processing.js 和 P5.js 之间的区别的教程可用 here