Processing如何根据JPG图片尺寸动态设置画布大小?
异常原因
你遇到的报错是Processing的固有规则导致的:默认渲染模式下,size() 必须是setup()函数中的第一行可执行代码,不能在加载资源、变量计算之后再调用,否则就会抛出IllegalStateException异常。你直接传固定值能正常运行,是因为编译器会把常量参数的size()自动提到setup最前面执行,动态变量就不支持这个逻辑。
方案1:动态适配图片尺寸
用Processing提供的surface.setSize()方法实现窗口尺寸动态修改,先给size()传任意初始值,加载完图片后再修改窗口尺寸即可,修改后的代码如下:
PImage bg; int wWidth, wHeight; void setup() { // 初始值可任意填写,必须放在setup第一行 size(1, 1); bg = loadImage("102.jpg"); wWidth = bg.width; wHeight = bg.height; // 动态修改画布尺寸 surface.setSize(wWidth, wHeight); } void draw() { background(bg); }
如果后续要切换不同尺寸的背景图,只需要在切换图片的逻辑后面追加调用surface.setSize(新图.width, 新图.height)即可。
方案2:提前统一所有素材尺寸
如果你的项目所有场景的画布尺寸固定,优先选择这个方案,稳定性更高,还能避免动态修改尺寸带来的布局错位、渲染异常问题。你可以用Processing写个批量处理脚本一次性把所有JPG调整为统一尺寸,示例脚本如下:
// 批量调整图片尺寸脚本,运行前把所有素材放在项目的data文件夹下 int targetWidth = 806; int targetHeight = 1229; // 替换成你的所有素材文件名 String[] imgNames = {"102.jpg", "103.jpg", "104.jpg"}; void setup() { for (String name : imgNames) { PImage img = loadImage(name); img.resize(targetWidth, targetHeight); // 调整后的文件会存在项目根目录,可自行修改存储路径 img.save("resized_" + name); } exit(); }
内容的提问来源于stack exchange,提问作者Pontius
相关产品推荐
相关产品推荐

