PGraphics2D 应该实现可克隆但抛出异常
PGraphics2D should implement cloneable but throws exception
使用 Java 处理,我正在尝试制作 PGraphics2D 对象的深层副本
PGraphics2D pg_render;
pg_render = (PGraphics2D) createGraphics(width, height, P2D);
PGraphics2D pg_postprocd = (PGraphics2D)pg_render.clone();
抛出 CloneNotSupportedException:
Unhandled exception type CloneNotSupportedException
但阅读 the doc 似乎实施了克隆。
我需要有两个 PGraphics2D 对象的实例,这样我就可以对一个应用 post 处理效果,并保持另一个干净,以便分析运动矢量等。
异常
PGraphics
class 本身并不实现 Clonable
。相反,它扩展了 PImage
,这是实际实现 Cloneable
接口的 class。
这就是您对 pg_render.clone()
的调用抛出 CloneNotSupportedException
的原因,因为 PGraphics 实际上并不支持克隆(但碰巧扩展了支持克隆的 class)。
解决方案
下面的静态方法 returns 是输入 PGraphics 对象的 克隆。它使用 createGraphics()
创建一个新的 PGraphics
对象,克隆样式(样式包括当前填充颜色等内容),最后克隆像素缓冲区。
代码
static PGraphics clonePGraphics(PGraphics source) {
final String renderer;
switch (source.parent.sketchRenderer()) {
case "processing.opengl.PGraphics2D" :
renderer = PConstants.P2D;
break;
case "processing.opengl.PGraphics3D" :
renderer = PConstants.P3D;
break;
default : // secondary sketches cannot use FX2D
renderer = PConstants.JAVA2D;
}
PGraphics clone = source.parent.createGraphics(source.width, source.height, renderer);
clone.beginDraw();
clone.style(source.getStyle()); // copy style (fillColor, etc.)
source.loadPixels(); // graphics buffer -> int[] buffer
clone.pixels = source.pixels.clone(); // in's int[] buffer -> clone's int[] buffer
clone.updatePixels(); // int[] buffer -> graphics buffer
clone.endDraw();
return clone;
}
使用 Java 处理,我正在尝试制作 PGraphics2D 对象的深层副本
PGraphics2D pg_render;
pg_render = (PGraphics2D) createGraphics(width, height, P2D);
PGraphics2D pg_postprocd = (PGraphics2D)pg_render.clone();
抛出 CloneNotSupportedException:
Unhandled exception type CloneNotSupportedException
但阅读 the doc 似乎实施了克隆。
我需要有两个 PGraphics2D 对象的实例,这样我就可以对一个应用 post 处理效果,并保持另一个干净,以便分析运动矢量等。
异常
PGraphics
class 本身并不实现 Clonable
。相反,它扩展了 PImage
,这是实际实现 Cloneable
接口的 class。
这就是您对 pg_render.clone()
的调用抛出 CloneNotSupportedException
的原因,因为 PGraphics 实际上并不支持克隆(但碰巧扩展了支持克隆的 class)。
解决方案
下面的静态方法 returns 是输入 PGraphics 对象的 克隆。它使用 createGraphics()
创建一个新的 PGraphics
对象,克隆样式(样式包括当前填充颜色等内容),最后克隆像素缓冲区。
代码
static PGraphics clonePGraphics(PGraphics source) {
final String renderer;
switch (source.parent.sketchRenderer()) {
case "processing.opengl.PGraphics2D" :
renderer = PConstants.P2D;
break;
case "processing.opengl.PGraphics3D" :
renderer = PConstants.P3D;
break;
default : // secondary sketches cannot use FX2D
renderer = PConstants.JAVA2D;
}
PGraphics clone = source.parent.createGraphics(source.width, source.height, renderer);
clone.beginDraw();
clone.style(source.getStyle()); // copy style (fillColor, etc.)
source.loadPixels(); // graphics buffer -> int[] buffer
clone.pixels = source.pixels.clone(); // in's int[] buffer -> clone's int[] buffer
clone.updatePixels(); // int[] buffer -> graphics buffer
clone.endDraw();
return clone;
}