模拟区域截图
Taking a screenshot of the simulation area
嗨,有谁知道截取模拟屏幕截图的好方法,这样您就可以指定分辨率并获得更高质量的图像?
我能想到的唯一方法是放大并将多个图像拼接在一起,但是需要很长时间...
更新:
我成功地导出了整个区域,神奇的参数是:.setAnimationParameterEnabled(Panel.ANIM_BOUNDS_CLIPPING_XJAL, false)
它会强制 Anylogic 绘制整个区域,而不仅仅是可见区域。
但它并不总是有效。我必须 运行 代码,在该区域四处移动,缩放 in/out 并重试。在某些时候它真的会出现故障,可能是因为它开始绘制所有东西,然后代码就可以工作了。问题是我不知道该怎么做才能让它发挥作用……
java.awt.Component alPanel = getExperiment().getPresentation().getPanel();
getExperiment().getPresentation().getPanel().setAnimationParameterEnabled(Panel.ANIM_BOUNDS_CLIPPING_XJAL, false);
getExperiment().getPresentation().setMaximized(false);
getExperiment().getPresentation().setPanelSize(5000, 5000);
java.awt.image.BufferedImage imageExperiment = new java.awt.image.BufferedImage(
alPanel.getWidth(),
alPanel.getHeight(),
java.awt.image.BufferedImage.TYPE_INT_RGB
);
getExperiment().drawPresentation(getExperiment().getPresentation().getPanel(), imageExperiment.createGraphics(), false);
java.awt.Component component = getExperiment().getPresentation().getPanel();
// call the Component's paint method, using
// the Graphics object of the image.
component.paintAll( imageExperiment.getGraphics() ); // alternately use .printAll(..)
try {
// write the image as a PNG
javax.imageio.ImageIO.write(
imageExperiment,
"png",
new File("screenshotAnylogic.png"));
} catch(Exception e) {
e.printStackTrace();
}
好吧,据我所知,Anylogic 中没有针对 that.You 的内置方法,但可以尝试使用 Java 来实现这一点。可以通过 getExperiment().getPresentation().getPanel()
获取包含模拟的面板,您可以从中创建图像。例如,here 对此进行了解释,代码如下所示:
public static BufferedImage getScreenShot(Component component)
{
BufferedImage image = new BufferedImage(
component.getWidth(),
component.getHeight(),
BufferedImage.TYPE_INT_RGB
);
// call the Component's paint method, using
// the Graphics object of the image.
component.paint( image.getGraphics() ); // alternately use .printAll(..)
return image;
}
public static void saveComponentScreenshot(Component component)
{
try {
// write the image as a PNG
ImageIO.write(
getScreenShot(component),
"png",
new File("screenshot.png"));
} catch(Exception e) {
e.printStackTrace();
}
}
不幸的是,这并没有为您提供您可能想要的更大的视口。也许从 getExperiment() 返回的 Experiment 对象中可用的方法 public final void drawPresentation(Panel panel, java.awt.Graphics2D g, boolean publicOnly)
可以帮助您在具有所需尺寸的自定义面板上绘制模拟。相当hacky,但这就是我能想出的全部^^
好吧...经过大量实验,我发现 "magic parameter" 并不像我想象的那么神奇。
但是这段代码应该能够创建一个扩展可见区域的屏幕截图:
public void capturePanel (ShapeGroup p, String fileName) {
Panel argPanel = p.getPresentable().getPresentation().getPanel();
BufferedImage capture = new BufferedImage(4000, 4000, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = capture.createGraphics();
g.setClip( -200, -200, 4000, 4000 );
p.draw( argPanel, g, null, true );
g.dispose();
try {
ImageIO.write(capture, "png", new File(fileName));
} catch (IOException ioe) {
System.out.println(ioe);
}
}
嗨,有谁知道截取模拟屏幕截图的好方法,这样您就可以指定分辨率并获得更高质量的图像? 我能想到的唯一方法是放大并将多个图像拼接在一起,但是需要很长时间...
更新:
我成功地导出了整个区域,神奇的参数是:.setAnimationParameterEnabled(Panel.ANIM_BOUNDS_CLIPPING_XJAL, false)
它会强制 Anylogic 绘制整个区域,而不仅仅是可见区域。
但它并不总是有效。我必须 运行 代码,在该区域四处移动,缩放 in/out 并重试。在某些时候它真的会出现故障,可能是因为它开始绘制所有东西,然后代码就可以工作了。问题是我不知道该怎么做才能让它发挥作用……
java.awt.Component alPanel = getExperiment().getPresentation().getPanel();
getExperiment().getPresentation().getPanel().setAnimationParameterEnabled(Panel.ANIM_BOUNDS_CLIPPING_XJAL, false);
getExperiment().getPresentation().setMaximized(false);
getExperiment().getPresentation().setPanelSize(5000, 5000);
java.awt.image.BufferedImage imageExperiment = new java.awt.image.BufferedImage(
alPanel.getWidth(),
alPanel.getHeight(),
java.awt.image.BufferedImage.TYPE_INT_RGB
);
getExperiment().drawPresentation(getExperiment().getPresentation().getPanel(), imageExperiment.createGraphics(), false);
java.awt.Component component = getExperiment().getPresentation().getPanel();
// call the Component's paint method, using
// the Graphics object of the image.
component.paintAll( imageExperiment.getGraphics() ); // alternately use .printAll(..)
try {
// write the image as a PNG
javax.imageio.ImageIO.write(
imageExperiment,
"png",
new File("screenshotAnylogic.png"));
} catch(Exception e) {
e.printStackTrace();
}
好吧,据我所知,Anylogic 中没有针对 that.You 的内置方法,但可以尝试使用 Java 来实现这一点。可以通过 getExperiment().getPresentation().getPanel()
获取包含模拟的面板,您可以从中创建图像。例如,here 对此进行了解释,代码如下所示:
public static BufferedImage getScreenShot(Component component)
{
BufferedImage image = new BufferedImage(
component.getWidth(),
component.getHeight(),
BufferedImage.TYPE_INT_RGB
);
// call the Component's paint method, using
// the Graphics object of the image.
component.paint( image.getGraphics() ); // alternately use .printAll(..)
return image;
}
public static void saveComponentScreenshot(Component component)
{
try {
// write the image as a PNG
ImageIO.write(
getScreenShot(component),
"png",
new File("screenshot.png"));
} catch(Exception e) {
e.printStackTrace();
}
}
不幸的是,这并没有为您提供您可能想要的更大的视口。也许从 getExperiment() 返回的 Experiment 对象中可用的方法 public final void drawPresentation(Panel panel, java.awt.Graphics2D g, boolean publicOnly)
可以帮助您在具有所需尺寸的自定义面板上绘制模拟。相当hacky,但这就是我能想出的全部^^
好吧...经过大量实验,我发现 "magic parameter" 并不像我想象的那么神奇。 但是这段代码应该能够创建一个扩展可见区域的屏幕截图:
public void capturePanel (ShapeGroup p, String fileName) {
Panel argPanel = p.getPresentable().getPresentation().getPanel();
BufferedImage capture = new BufferedImage(4000, 4000, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = capture.createGraphics();
g.setClip( -200, -200, 4000, 4000 );
p.draw( argPanel, g, null, true );
g.dispose();
try {
ImageIO.write(capture, "png", new File(fileName));
} catch (IOException ioe) {
System.out.println(ioe);
}
}