Write swing component to large TIFF image using JAI

前端 未结 2 1829
说谎
说谎 2020-12-21 09:53

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 dis

2条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-21 09:55

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

提交回复
热议问题