我所擁有的是大量需要在較大圖像(如鑲嵌圖)中放置在一起的幀。圖像的所需位置是已知的。在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),它不是圖像寬度的倍數或任何我能想到的。
感謝所有幫助
哇,偉大的偵探工作,這解釋了我看到的奇怪行爲。這也不幸意味着我不能像我所希望的那樣用瓷磚書寫我的馬賽克,但是感謝你的幫助。 – David
如果右邊和底邊貼磚不合身,則會假定它們被填充。換句話說,這不是一個問題,你的圖像大小不是你的瓷磚大小的確切倍數。如果您的圖像尺寸爲128x128,則645x645的圖像將在文件中編碼6x6的圖塊,並且會浪費一些空間,但這非常有效。 – BitBank