我试图创建一个执行大量2D转换和形状渲染的快速图像生成器,所以我试图使用BufferedImage然后获取Graphics2D对象来执行所有绘图。我现在主要关心的是制作速度非常快,因此我正在创建一个BufferedImage,如下所示:
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration(); BufferedImage bImage = gc.createCompatibleImage(width, height, Transparency.TRANSLUCENT); Graphics2D graphics = bImage.createGraphics();
但是,如果我这样做:
System.out.println(bImage.getCapabilities(gc).isAccelerated());
输出始终为 false ,即使我使用-Dsun.java2d.opengl = True启动JVM也会显示以下行:
OpenGL pipeline enabled for default config on screen 0
我正在执行BufferedImage,因为最后我想使用ImageIO.write(bImage,“ PNG”,file);将其保存到PNG文件。
我可以创建一个VolatileImage,它会说它被加速了,但是ImageIO在尝试保存时不喜欢它,并说该图像不能转换为RenderedImage。关于如何获取可以存储到磁盘的加速映像的任何想法?另外我也不想创建VolatileImage并将其复制到BufferedImage进行保存,因为我的图像很大,会遇到内存不足的问题…
通过我的调查并阅读了Sun / Oracle 2D教程,我发现了以下内容:
要创建加速图像,可以使用易失性图像(将其创建为pbuffer)。有优点也有缺点,在您尝试获取栅格像素数据之前,VolatileImages很快。在那一刻,它们成为普通的bufferedImage。而且它们是易变的,并且不能保证在渲染结束时将可用。为此,您执行:
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration(); VolatileImage vImage = gc.createCompatibleVolatileImage(width, height, Transparency.TRANSLUCENT);
这将为您提供加速的图像,但是无法使用ImageIO直接将其写入以表示PNG文件。
为了使用普通的BufferedImage,您需要执行以下操作:
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration(); BufferedImage img = gc.createCompatibleImage(width, height, Transparency.TRANSLUCENT); img.setAccelerationPriority(1);
这将创建一个BufferedImage,它不会被加速,但是您可以通过在setAccelerationPriority中传递1来向JVM提供提示。您可以在Java Tutorial的2D路径上阅读此内容。