2011-08-01 55 views
3

我所擁有的是大量需要在較大圖像(如鑲嵌圖)中放置在一起的幀。圖像的所需位置是已知的。在Java中使用ImageIO編寫TIFF的平鋪輸出

有很多圖像,所以將它們全部加載到內存中是最不切實際的。

基於這裏的一些其他答案,我能夠覆蓋RenderedImage中的方法(特別是getData(rect)),以加載適當的數據並返回它。

這工作得很好,但圖像編寫器總是調用getData並請求數據行。在我看來,我應該能夠改變ImageWriterParam來調用單個tile,但是當我嘗試write函數仍然要求從getData單行。

我該如何強制這個使用tile並調用getTile來代替。

BufferedOutputStream bos=null; 
try { 
    bos = new BufferedOutputStream(new FileOutputStream(new File("test2.tiff"))); 

    ImageWriter writer =(ImageWriter) ImageIO.getImageWritersBySuffix("tif").next(); 

    ImageOutputStream ios=null 

    ios = ImageIO.createImageOutputStream(bos); 

    writer.setOutput(ios); 
    ImageWriteParam param = writer.getDefaultWriteParam(); 
    param.setTilingMode(ImageWriteParam.MODE_DEFAULT); 

    RenderedImage mosaic = new MosaicImage(imageFiles[]); 

    writer.write(null,new IIOImage(mosaic,null,null),param); 

    } catch (FileNotFoundException ex) { 

    } 

注意在使用本然而,當我可以使用param.setTilingMode(ImageWriteParam.MODE_EXPLICIT);setTiling(w,h,xoff,yoff);

writer.write仍然在我的圖像調用getData(rect),很煩人不要求通過w,h指定大小的矩形。它調用一個大小是由一些隨機量不同的矩形(大概來自東西)

例如,如果我用setTiling(100,100,0,0);

人們所期望的,即使它不從圖像調用getTile中,傳遞給getData的矩形應該是(0,0,100,100),但是它會傳遞Rectangle(0,0,96,96),它不是圖像寬度的倍數或任何我能想到的。

感謝所有幫助

回答

3

如果您對下TileWidth和TileLength領域的TIFF 6.0規格讀了,你會發現文字

TileWidth必須是16的倍數。這個限制提高在一些圖形環境中的性能,並增強與JPEG等壓縮方案的兼容性 。

與TileLength類似。 100x100不能被16整除,但96x96是,我敢打賭是TIFF編碼器盡力滿足你的要求。

+0

哇,偉大的偵探工作,這解釋了我看到的奇怪行爲。這也不幸意味着我不能像我所希望的那樣用瓷磚書寫我的馬賽克,但是感謝你的幫助。 – David

+0

如果右邊和底邊貼磚不合身,則會假定它們被填充。換句話說,這不是一個問題,你的圖像大小不是你的瓷磚大小的確切倍數。如果您的圖像尺寸爲128x128,則645x645的圖像將在文件中編碼6x6的圖塊,並且會浪費一些空間,但這非常有效。 – BitBank