2012-04-20 23 views
19

javaを使用してソケットで複数のイメージを送信しようとしていますが、イメージをバイト配列に変換して送信できます。次のコードを試しましたが、C:\ドライブに約10,000枚の画像を書きました。ディスクに書き込まずにこの変換を行う方法はありますか?ありがとう!Java-バッファリングされたイメージをディスクに書き込まずにbyte []に​​変換する

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 

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

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

ノート(低品質)JPEGは、ネットワークの多くの時間を節約することができます。実際に送信されたバイトサイズを考慮する必要があると思います。これは純粋な 'BufferedImage'でかなり大きくなります。ところで、これらの画像のソースは何ですか?たとえば、スクリーンショットの場合、PNGはデフォルトの圧縮JPEGよりも小さいバイトサイズを提供できます。それが連続的なスクリーンショットであった場合、おそらくはビデオストリームであっても。 –

+0

ソースは、私が本質的にストリームにする連続的なスクリーンショットです。しかし、はい、ディスクに書き込まずに画像を圧縮する方法を理解する必要があります。それが私の究極の目標です。 – tier1

答えて

38

これは動作するはずです:

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

あなたの命の恩人です。ありがとう! – tier1

+14

イメージのコピーが作成されます。あなたがちょうどバイトへのダイレクトリファレンスをしたいのであれば、bufferedImage.getRaster()。getDataBuffer()をコールし、それに応じてキャストします(DataBufferByteへのキャストは必ずしも安全ではありません)。 –

+3

これは私にとってはうまくいかないようです。 'java.awt.image.DataBufferIntはjava.awt.image.DataBufferByte'にキャストできません。私のbufferedimageは' Robot.createScreenCapture() 'から来ていますかどうか分かりません。 – user3712476

-2

使用のApache CommonsのIO UtilsのApache Commons

IOUtils.copy(InputStreamの、OutputStreamを)。助けているかもしれない、書き込む前に

ImageIO.setUseCache(false); 

IO Utils APIは簡単

1

使用してみてください大きなバッファをサポートしています。

+0

私はこれを試しました、しかし、私はこれがまだディスクに書き込むと信じています、それは単に操作が完了した後にそれを削除します。 – tier1

+0

これは、少なくともdocsによると: 'このフラグをfalseに設定すると、将来のストリーム用にディスクを使用できなくなります。ファイルの作成と破棄のオーバーヘッドがなくなるため、小さな画像を扱うときに便利です。おそらくあなたのプログラムは別の場所でディスクに書き込みますか? – soulcheck

+0

ええ、私はドキュメントでもそれを見ました。いずれにしても、私が探していることは操作が辛いです。しかし、ありがとう。 – tier1

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パッケージを使用しないでください。 –

関連する問題