我不得不加载并存储一个大的tiff(59392x40192px)与JAI.我的解决方案是:TiledImages.
我使用了TiledImage,因为我需要tile和subimages.
要使用TiledImage效率,您应该使用您喜欢的磁贴大小来构建它. JAI使用TileCache,因此当不需要时,整个Image都不会在内存中.
要在文件中编写TiledImage,请使用选项“writeTiled”(避免使用OutOfMemory,因为它逐个tile地写入):
public void storeImage(TiledImage img, String filepath) {
TIFFEncodeParam tep = new TIFFEncodeParam();
//important to avoid OutOfMemory
tep.setTileSize(256, 256);
tep.setWriteTiled(true);
//fast compression
tep.setCompression(TIFFEncodeParam.COMPRESSION_PACKBITS);
//write file
JAI.create("filestore", img, filepath, "TIFF", tep);
}
它适用于高达690mb(压缩)的图像,对于尚未测试的较大图像.
但是,如果你正在使用32位WinXP,你可能无法拥有更多的1280m HeapSpace大小,这仍然是Java VM的限制.
我的TiledImage是使用我的图像源数据中的IndexedColorModel构建的:
//here you create a ColorModel for your Image
ColorModel cm = source.createColorModel();
//then create a compatible SampleModel, with the tilesize
SampleModel sm = cm.createCompatibleSampleModel(tileWidth,tileHeight);
TiledImage image = new TiledImage(0, 0, imageWidth, imageHeight, 0, 0, sm, cm);