Java 使用JAI将swing组件写入大型TIFF图像

Java 使用JAI将swing组件写入大型TIFF图像,java,swing,tiff,jai,Java,Swing,Tiff,Jai,我有一个很大的swing组件要写给TIFF。该组件太大,无法在内存中加载TIFF,因此我需要制作一个由基于磁盘的可写光栅(如上所述)支持的大BuffereImage,或者使用JAI 除了项目的完全混乱之外,JAI似乎是更好的答案 有鉴于此,有人能概述一下在不耗尽内存的情况下将swing组件写入平铺TIFF的步骤吗 图像大小可能为10000x700 理想情况下,我会创建某种基于磁盘的映像,并将部分组件写入其中,每次写入都会刷新到磁盘 编辑 我想我可以用一个ImageWriter来做这件事,但是当我

我有一个很大的swing组件要写给TIFF。该组件太大,无法在内存中加载TIFF,因此我需要制作一个由基于磁盘的可写光栅(如上所述)支持的大BuffereImage,或者使用JAI

除了项目的完全混乱之外,JAI似乎是更好的答案

有鉴于此,有人能概述一下在不耗尽内存的情况下将swing组件写入平铺TIFF的步骤吗

图像大小可能为10000x700

理想情况下,我会创建某种基于磁盘的映像,并将部分组件写入其中,每次写入都会刷新到磁盘

编辑

我想我可以用一个ImageWriter来做这件事,但是当我打电话时,我得到了一个NoTouchElementException:

ImageWriter imageWriter = ImageIO.getImageWritersByFormatName("tif").next();
我的类路径上有jai_code.jar和jai_core.jar jar,还有什么我需要做的吗

编辑 我可以使用JAI创建一个非常大的TIFF,但是JAI不支持TIFF压缩,所以文件是92 MB

如果我安装JAI ImageIO,我可以使用ImageWriter创建压缩的TIFF,但只能从光栅或缓冲图像创建,因为我没有足够的内存


有什么方法可以分两步进行,使用JAI创建大TIFF,然后压缩大TIFF,而不将整个内容加载到内存中?

我也有同样的情况,我使用了以下步骤:

  • 作为缓冲区加载图像

  • 将缓冲区图像大小调整为首选大小(600x600px),使用

  • 使用方法中的方法绘制图像


这有助于我显示和操作约50MB(5000x5000像素)的TIFF图像。

我必须用JAI加载和存储一个大TIFF(59392x40192px)。我的解决方案是:平铺图像

我使用了瓷砖图像,因为我需要瓷砖和子图像。 要高效地使用TileImage,您应该使用首选的tile大小构建它。JAI使用TileCache,因此在不需要时,不会将整个图像存储在内存中

要在文件中写入平铺图像,请使用选项“Writeiled”(避免OutOfMemory,因为它会逐个平铺写入):

它适用于高达690mb(压缩)的图像,适用于我还没有测试过的较大图像

但是,如果您使用的是32位WinXP,您可能无法拥有超过1280m的堆空间大小,这仍然是Java虚拟机的限制

我的TileImage是使用来自图像源数据的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);

谢谢,D1i,我正在尝试将一个非常大的映像写入磁盘。我无法创建足够大的BuffereImage,因为内存不足。最后的图像,我真的想要10000像素宽。我明白了,然后我误解了这个问题;O.我也期待着回答,看起来很有用。你如何创建TileImage?我已经在上面添加了TileImage创建。我直接在图像中设置样本,因为我必须从源代码中逐个加载px。因此,在加载时,我在内存中始终有一个磁贴。
//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);