本文介绍了使用JAI将摆动分量写入大的TIFF图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个很大的摆动组件要写入TIFF.该组件太大,无法将TIFF加载到内存中,因此我要么需要制作一个较大的BufferedImage,该BufferedImage由基于磁盘的WritableRaster支持(如所述)或使用JAI.

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

鉴于此,有人可以概述在不耗尽内存的情况下将我的swing组件写入图块TIFF的步骤吗?

图片尺寸可能为10000x700

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

编辑

我想我可以使用ImageWriter来做到这一点,但是我在调​​用时遇到了NoSuchElementException异常:

ImageWriter imageWriter = ImageIO.getImageWritersByFormatName("tif").next();

我的类路径上有jai_code.jar和jai_core.jar罐子,还有其他需要做的事情吗?

编辑我可以使用JAI创建非常大的TIFF,但是JAI不支持TIFF压缩,因此文件为92 MB.

如果安装JAI-ImageIO,则可以使用ImageWriter创建压缩的TIFF,但只能从没有足够内存的Raster或BufferedImage中创建.

是否有某种方法可以进行两步操作,使用JAI创建大型TIFF,然后压缩大型TIFF,而无需将整个内容加载到内存中?

我必须使用JAI加载并存储一个大型tiff(59392x40192px).我的解决方案是:TiledImages.

我使用了TiledImage,因为我需要图块和子图像.为了高效使用TiledImage,您应该使用自己喜欢的图块大小来构建它. JAI使用TileCache,因此不需要时不会将整个Image放在内存中.

要在文件中写入TiledImage,请使用选项"writeTiled"(避免OutOfMemory,因为它会逐块写入):

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);

I have a large swing component to write to TIFF. The component is too large to load the TIFF in memory, so I either need to make a big BufferedImage which is backed by a disk-based WritableRaster (as mentioned here) or use JAI.

JAI seems like the better answer, aside from the utter confusion of the project.

Given that, can someone outline steps for writing my swing component to a tiled TIFF without running out of Memory?

Image size will be maybe 10000x700

Ideally I would create some sort of disk-based image, and write parts of the component to it, each write being flushed to disk.

EDIT

I think I could do this with an ImageWriter, however I'm getting a NoSuchElementException when I call:

ImageWriter imageWriter = ImageIO.getImageWritersByFormatName("tif").next();

I have the jai_code.jar and jai_core.jar jars on my classpath, is there something else I need to do?

EDITI can create a very large TIFF using JAI, but JAI doesn't support TIFF compression, so the file is 92 MB.

If I install JAI-ImageIO, I can create a compressed TIFF Using an ImageWriter, but only from a Raster or BufferedImage, which I don't have enough memory for.

Is there some way to do a two-step approach, use JAI to create the large TIFF, then compress the large TIFF without loading the whole thing into memory?

解决方案

I had to load and store a large tiff (59392x40192px) with JAI. My solution is: TiledImages.

I have used a TiledImage because I need tiles and subimages.To use the TiledImage efficient you should construct it with your prefered tile size. JAI uses a TileCache so not the whole Image will be in memory, when it's not needed.

To write the TiledImage in a File use the option "writeTiled" (avoid OutOfMemory because it writes tile by 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);
}

It works fine with images up to 690mb (compressed), for larger images i haven't tested yet.

But if you are working on WinXP 32-bit you may not able to have more as 1280m HeapSpace size, this is still a limit of Java VM.

My TiledImage is build with a IndexedColorModel from my image-source data:

//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);

这篇关于使用JAI将摆动分量写入大的TIFF图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-22 21:40