2010-06-11 42 views
3

我必須創建一個分辨率非常大的圖像, 但圖像相對「稀疏」,圖像中只有一些區域需要繪製。在java中創建一個稀疏的BufferedImage

例如用下面的代碼

/* this take 5GB memory */ 

    final BufferedImage img = new BufferedImage(36000, 36000, BufferedImage.TYPE_INT_ARGB); 

/* draw something */ 

    Graphics g = img.getGraphics(); 
    g.drawImage(....); 

/* output as PNG */ 

    final File out = new File("out.png"); 
    ImageIO.write(img, "png", out); 

在我建立結束時的PNG圖像是僅約200〜300 MB。

問題是 如何避免在開始時創建5GB BufferedImage? 我確實需要大尺寸的圖像,但顏色信息非常稀疏。

是否有任何Stream for BufferedImage,以便它不會佔用太多內存?

+0

使用DEFLATE算法壓縮PNG作爲創建它的最後一步,因此它比「BufferedImage」小得多,這並不奇怪。 – Powerlord 2010-06-11 14:23:42

回答

1

是否有沒有使用懶惰初始化地圖或類似結構的完整小BufferedImages的原因?

編輯:這是一個非常專業的數據結構。如果要繪製圖像,請以合理的方式對其進行拼貼,然後對每個圖像應用相應的AffineTransform。然後,您可以遍歷集合並繪製到每個集合,並將它歸爲空或如果它之後爲空,則將其重新設爲Flyweight。我不知道將它們全部結合到Java內部的PNG中的非痛苦方式。

0

您的示例使用TYPE_INT_ARGB作爲每像素4個字節的圖像類型。如果圖像的顏色數量有限,則可以使用每像素數量較少的不同圖像類型。

這可能會減少每像素的字節數,但最好的情況是每個像素1字節,這仍然會使用超過1 GB。

否則,您可以嘗試將渲染分成多個圖像並將它們分離合並在一起。