我必须使用JAI加载并存储一个大型tiff(59392x40192px)。我的解决方案是:TiledImages。
我使用了TiledImage,因为我需要图块和子图像。为了高效使用TiledImage,您应该使用自己喜欢的图块大小来构建它。JAI使用TileCache,因此不需要时不会将整个Image都存储在内存中。
要将TiledImage写入文件,请使用选项“ writeTiled”(避免OutOfMemory,因为它会逐块写入):
public void storeImage(TiledImage img, String filepath) { TIFFEnpreParam tep = new TIFFEnpreParam(); //important to avoid OutOfMemory tep.setTileSize(256, 256); tep.setWriteTiled(true); //fast compression tep.setCompression(TIFFEnpreParam.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 ImageColorModel cm = source.createColorModel();//then create a compatible SampleModel, with the tilesizeSampleModel sm = cm.createCompatibleSampleModel(tileWidth,tileHeight);TiledImage image = new TiledImage(0, 0, imageWidth, imageHeight, 0, 0, sm, cm);
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)