2011-05-12 97 views
3

我有一個很大的swing組件來寫入TIFF。該組件太大而無法將TIFF加載到內存中,所以我需要製作一個大型的BufferedImage,它由基於磁盤的WritableRaster(如提到的here)支持或使用JAI。使用JAI將擺動組件寫入大型TIFF圖像

JAI似乎是更好的答案,除了項目的完全混淆。

鑑於這樣的情況,有人可以概述將我的swing組件寫入平鋪TIFF而不會耗盡內存的步驟嗎?

圖像尺寸將可能10000x700

理想我想建立某種形式的基於磁盤的形象,並寫入將組件的部分,每個部分寫被刷新到磁盤。

編輯

我想我可以用一個ImageWriter做到這一點,但是我得到的時候我叫一個NoSuchElementException:我jai_code.jar和jai_core.jar罐子

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

在我的班級路線上,還有什麼我需要做的?

編輯 我可以使用JAI創建一個非常大的TIFF,但JAI不支持TIFF壓縮,所以文件爲92 MB。

如果我安裝JAI-ImageIO,我可以使用ImageWriter創建壓縮的TIFF,但只能從Raster或BufferedImage創建,而我沒有足夠的內存。

有沒有辦法做兩步法,使用JAI創建大型TIFF,然後壓縮大型TIFF而不將整個東西加載到內存中?

回答

2

我不得不用JAI加載和存儲一個大的tiff(59392x40192px)。我的解決方案是:TiledImages。

我已經使用了TiledImage,因爲我需要瓷磚和子圖像。 要高效使用TiledImage,您應該使用您的首選磁貼大小來構建它。 JAI使用TileCache,因此當不需要時,整個圖像都會在內存中。

要編寫TiledImage在文件中使用選項「writeTiled」(避免內存不足,因爲它由瓷磚寫道瓦):

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

你如何創建TiledImage? – 2011-06-16 14:31:07

+0

我已經添加了上面的TiledImage創建。我直接在圖像中設置樣本,因爲我必須從我的源代碼中通過px加載px。所以我在裝載時一直在內存中存儲一​​塊瓦片。 – Indimental 2011-06-16 14:57:42

1

我有同樣的情況,我使用的下列步驟:

即幫我表示和操縱TIFF圖像〜50MB(5000x5000px)。

+0

謝謝,D1i,我想寫一個非常大的圖像到磁盤。我無法創建足夠大的BufferedImage,因爲內存不足。最終的圖像,我真的想成爲10000像素寬。 – 2011-05-12 19:50:35

+0

我明白了,於是我誤解了這個問題; O。我期待着回答,看起來很有用。 – JMelnik 2011-05-12 19:57:09