在我的eclipse-rcp应用程序中,我需要创建尺寸为30000x10000像素或更高的图像.此图像是NatTable表示.使用标准的图像创建方法,它失败了不同的问题:OutOfMemory,SWTError - IllegalArgument或我的电脑停止响应(顺便说一句,它的Windows 7,64位,4 RAM - 客户端有更慢的笔记本电脑,但仍然需要创建图片) .这是一段代码:
private Image getNattableImageRepresentation(final Display display) {
final Rectangle totalGridArea = getTotalGridArea(); //this returns Rectangle(0,0,30000,10000)
setGridLayerSize(totalGridArea);
final Image nattableImage = new Image(display, totalGridArea);
final GC nattableGC = new GC(nattableImage);
gridLayer.getLayerPainter().paintLayer(gridLayer, nattableGC, 0, 0, totalGridArea, configRegistry);//nattable API, which draws an image into a specified gc
restoreGridLayerState();
return nattableImage;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
是否有任何技巧来创建如此巨大的图像或可能是API?Java Advanced Imaging Api适用于此目的吗?
任何建议表示赞赏.
我试图在Java中加载大图像文件,如果文件太大(我已经尝试通过命令行标志增加堆大小),我收到内存错误消息.
我用以下方式加载图像:
如果图像不是tiff图像我正在使用此代码:
BufferedImage img = ImageIO.read(fileToOpen);
Run Code Online (Sandbox Code Playgroud)
如果文件是tiff,我使用此代码:
BufferedImage img = JAI.create("fileload",
fileToOpen.getAbsolutePath()).getAsBufferedImage();
Run Code Online (Sandbox Code Playgroud)
我的问题实际上归结为:图像处理程序(例如Photoshop)如何加载数百兆字节的文件而不会出现内存错误?
我的理解是,20MB jpeg很难加载到内存中的原因是因为在加载到BufferedImage时,例如你以未压缩的方式保存图像.因此,一种可能的解决方案是拥有一个Java类,该类是Image抽象类的子类,但以压缩形式存储数据.但这可能会有速度问题,因为运行时机器必须在绘制时解压缩数据.另一个选择是将原始未压缩数据缓存到磁盘并从那里无缝读取,但速度问题仍然存在.
那么大男孩怎么做呢?Photoshop如何在内存中加载200MB jpeg并绘制所有分辨率而没有任何明显的问题?
(最后注意:在我的应用程序中,由于速度问题,我得到我的BufferedImage后,我将其内容绘制到具有相同尺寸的VolatileImage上.这大大提高了绘图速度)