截取模拟区域的屏幕截图

时间:2015-05-11 09:47:28

标签: anylogic

您是否有人知道拍摄模拟屏幕截图的好方法,以便您可以指定分辨率并获得更高质量的图像? 我能想到的唯一方法是放大并将多个图像拼接在一起,但这需要很长时间......

更新
我成功地导出了整个区域,神奇的参数是:.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();
}

2 个答案:

答案 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,但我能想出的所有^^