2012-05-22 58 views
3

讀取和寫入png文件時出現問題。我用ImageIO將它讀入一個字節數組,然後使用ImageIO再次寫入這個字節數組。但文件大小顯着增加。這怎麼會發生?PNG使用Java讀寫增加文件大小

public BufferedImage toBufferedImage(InputStream inputstream) { 
    try { 
     return ImageIO.read(inputstream); 
    } catch (Exception e) { 
     throw new IllegalStateException("Can't convert to buffered image", e); 
    } 
} 

public byte[] toByteArray(BufferedImage bufferedImage, String filetype) { 
    ByteArrayOutputStream output = new ByteArrayOutputStream(); 
    try { 
     ImageIO.write(bufferedImage, filetype, output); 
     return output.toByteArray(); 
    } catch (Exception e) { 
     throw new IllegalStateException(e); 
    } 
} 

跟進:是否有任何庫,以支持用Java編寫,並且不需要任何本地代碼壓縮PNG圖片?

+0

不知是否是加入某種上寫的附加頭或者向標題添加額外的數據。檢查是否這樣的一個好方法是以Beyond Compare之類的方式打開這兩個文件,並查看是否所有的差異都在開始處(標題所在的位置)。如果不是,那麼差異可能是無處不在的,這可能表明它將在整個文件中添加空白數據。我懷疑這是因爲它重新編碼了文件 - 但這可能是一種可能性。 –

+0

我會想象這位作家對壓縮不是很聰明。也許有更好的輸出流或寫入器實現可以壓縮格式?包中的javadoc暗示了與此功能的接口。 – IanGilham

回答

1

documentation說,它的解碼輸入文件,所以它不是在內存中保存爲PNG:

返回一個BufferedImage,作爲使用一個ImageReader所提供的文件進行解碼的那些目前中自動選擇的結果註冊。該文件包裝在ImageInputStream中。如果沒有註冊的ImageReader聲稱能夠讀取結果流,則返回null。

寫回來時,它必須對PNG文件進行重新編碼,並且Java的PNG編碼似乎沒有創建原始文件那麼高效。

+0

我們最終使用了pngj(http://code.google.com/p/pngj/)來編寫,這似乎對我們所需要的工作非常有效。 – bertolami

5

這很可能是由於Java和創建原始PNG的壓縮算法不同。

1

隨JDK提供的PNG writer不支持壓縮。你可以迅速地檢查:

w = ImageIO.getImageWritersByFormatName("png").next(); 
p = w.getDefaultWriteParam(); 
print("Can compress? "+p.canWriteCompressed()); 
// Can compress? false 

這有可能是的ImageIO-EXT或JAI-ImageIO的包括與壓縮支持PNG作家:http://java.net/projects/imageio/