您是否有人知道拍摄模拟屏幕截图的好方法,以便您可以指定分辨率并获得更高质量的图像? 我能想到的唯一方法是放大并将多个图像拼接在一起,但这需要很长时间......
更新
我成功地导出了整个区域,神奇的参数是:.setAnimationParameterEnabled(Panel.ANIM_BOUNDS_CLIPPING_XJAL, false)
它将迫使Anylogic绘制整个区域,而不仅仅是可见区域 但它并不总是奏效。我必须运行代码,在区域内移动,放大/缩小并再试一次。在某些时候它会变得非常糟糕,可能是因为它开始绘制所有东西,然后代码工作。问题是,我无法弄清楚要做些什么来使其发挥作用......
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();
}
答案 0 :(得分:1)
好的......经过大量的实验,我发现“神奇的参数”并不像我想象的那么神奇。 但是这段代码应该能够创建一个扩展可见区域的屏幕截图:
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);
}
}
答案 1 :(得分:0)
嗯,afaik在Anylogic中没有内置的方法。你可以尝试使用Java来实现这一点。可以通过getExperiment().getPresentation().getPanel()
获取包含模拟的Panel,您可以从中创建图像。例如,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,但我能想出的所有^^