我正在使用远程网址来获取 PImage 。这是一个凸轮的jpg。我抓住它并每秒将其发送到图像()。每10秒切换到一个新凸轮。由于图像未成功下载,因此每小时左右,脚本因502错误而崩溃。
我正在尝试使用 requestImage()设置查看图像的脚本,进行快速错误检查,如果返回0或-1,则跳过该图像的绘制。哪个应该足够简单。但是......
如果 requestImage()的参数拒绝接受除字符串中的静态单个文件名以外的任何内容并且它位于 setup(),那么如何向 requestImage()发送不断更新的URL? em> / pre-process?
之前有人遇到过这个问题吗?或者我错过了什么?
这是代码。注意:目前凸轮不活动,因此阵列中有占位符......;
感谢您的期待!
PImage webImg;
PImage testImg;
int timer;
String[] camlist = {
"random_url_with_JPG_here",
"random_url_with_JPG_here",
"random_url_with_JPG_here"
};
//find length of array
int camListLength = int(random(camlist.length));
void setup() {
testImg = requestImage(webImg, "jpg");
noCursor();
fullScreen();
background(0);
}
void draw() {
if (millis() - timer >= 10000) {
camLoad();
timer = millis();
} else {
displayWebImage();
}
}
void camLoad() {
//find length of array
camListLength = int(random(camlist.length));
}
void displayWebImage() {
// load random cam url into 'webImg'
webImg = loadImage(camlist[camListLength], "jpg");
// test load
println(testImg.width);
if (testImg.width == 0) {
println("Not Loaded");
} else if (testImg.width == -1) {
println("random error");
} else {
// display 'webImage'
image(webImg, 0, 0, 800, 480);
// cache cleanup
g.removeCache(webImg);
delay(1000);
// frame count
println(frameCount+" "+g.getCache(webImg));
}
}
答案 0 :(得分:0)
对于95%的人来说,在draw()
函数中创建图像是一个非常糟糕的主意。大多数程序应该在setup()
函数的开头加载所有图像。
但如果您正在加载未提前知道的图片,那么没有什么能阻止您在draw()
功能中创建图片。您绝对可以在requestImage()
函数内调用draw()
。
但请注意,requestImage()
函数在后台运行,因此您的代码会在请求图像时继续执行。来自the reference:
此功能在单独的线程上加载图像,以便在设置()期间加载图像时草图不会冻结。在加载图像时,其宽度和高度将为0.如果在加载图像时发生错误,则其宽度和高度将设置为-1。
这意味着图像将在几秒钟后加载,因此您无法立即使用图像变量。您通过拨打delay()
来解决此问题,但您最好只使用loadImage()
功能。来自the reference:
如果文件不可用或发生错误,将返回null并将向控制台输出错误消息。错误消息不会暂停程序,但是如果您的代码不检查返回的值是否为null,则null值可能会导致NullPointerException。
...
根据错误类型,可能仍会返回PImage对象,但图像的宽度和高度将设置为-1。如果返回错误的图像数据或无法正确解码,则会发生这种情况。有时会出现产生403错误或重定向到密码提示的图像URL,因为loadImage()会尝试将HTML解释为图像数据。
该功能不在后台运行,因此代码仅在图像完全加载后才会继续。