2012-04-20 181 views
19

我試圖通過使用java的套接字發送多個圖像,但我需要更快的方式將圖像轉換爲字節數組,以便我可以發送它們。我嘗試了下面的代碼,但它向我的C:\驅動器寫了大約10,000個圖像。有沒有辦法在不寫入磁盤的情況下進行這種轉換?謝謝!Java-將bufferedimage轉換爲byte []而不寫入磁盤

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 

        //ImageIO.setUseCache(false); 
        ImageIO.write(bi.getImage(), "jpg", outputStream); 

        byte[] imageBytes = outputStream.toByteArray(); 
+0

注意一點額外的時間做使用更高的壓縮圖像壓縮(低質量)JPEG可以節省大量的網絡時間。我認爲你需要考慮實際發送的字節大小,在純粹的'BufferedImage'中會更大。順便說一句 - 這些圖像的來源是什麼?如果是例如截圖,通常PNG可以提供比默認壓縮JPEG更小的字節大小。如果它是連續的截圖,甚至可能是一個視頻流。 – 2012-04-20 13:47:36

+0

來源是我基本上製作成流的連續截圖。但是,是的,我需要弄清楚如何壓縮圖像而不寫入磁盤。這是我的終極目標 – tier1 2012-04-20 15:08:11

回答

38

這應該工作:

byte[] imageBytes = ((DataBufferByte) bufferedImage.getData().getDataBuffer()).getData(); 
+0

你的生活節省。謝謝! – tier1 2012-04-20 13:37:59

+14

這將創建圖像的副本。如果您只是想直接引用字節,請調用bufferedImage.getRaster()。getDataBuffer()並相應地進行轉換(對於DataBufferByte轉換並不總是安全的) – 2013-02-25 22:49:40

+3

這似乎不適用於我。我得到'java.awt.image.DataBufferInt不能轉換爲java.awt.image.DataBufferByte'我的bufferedimage來自'Robot.createScreenCapture()'不知道是否 – user3712476 2016-11-15 19:41:09

1

嘗試使用:

ImageIO.setUseCache(false); 

寫作之前,也許沒有什麼幫助。

+0

我試過這個,但是,我相信這仍寫入磁盤,它只是在操作完成後刪除它。 – tier1 2012-04-20 13:34:06

+0

它不應該,至少根據文檔:'將此標誌設置爲false不允許將磁盤用於將來的流,這可能有利於處理小圖像時,因爲創建和銷燬文件的開銷被移除。也許你的程序寫到其他地方的磁盤? – soulcheck 2012-04-20 13:37:06

+0

是的,我在文檔中也看到了。無論哪種方式,這個操作對我所要做的事情來說都很痛苦。不過謝謝。 – tier1 2012-04-20 13:39:13

1
BufferedImage img = ImageIO.read(new ByteArrayInputStream(bytes)); 
byte[] bytes = new byte[buf.capacity()]; 
buf.get(bytes, 0, bytes.length); 
0

低於它的真快(幾毫秒)代碼

import com.sun.image.codec.jpeg.JPEGCodec; 
import com.sun.image.codec.jpeg.JPEGImageEncoder; 

public byte[] toByteArray(BufferedImage image) throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream();    
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(baos); 
    encoder.encode(image);    
    return baos.toByteArray(); 
} 
+3

最好遠離com.sun包。 – 2016-11-15 04:12:41

相關問題