2016-06-14 20 views
2

私は、ソケットを介してBufferedImageを持つオブジェクトを送信しようとしています。 BufferedImageはシリアライズ可能ではないため、シリアライズ可能なデータ型に変換してから、元に戻す必要があります。私は多くのオンラインを見てきました。そして、バイト[]はBuffereImageを送るだけのようですが、オブジェクト全体を送信しようとしていますので、int []に向かってもっと傾いています。私は数週間前にこれを説明した答えを見つけたと思ったが、2.5時間の検索の後にはそれを見つけることができなかった。私はJava Oracleを試しましたが、すぐに失われました。BufferedImageをint []に変換するには?

もっと良い方法があれば、私はソケットとBufferedImageの操作で実際にはあまり働いていないので、私の無知を許してください。

+0

を、私はそれが使用されて参照インスタンスのほとんどはただ翻弄画像全体ではなく、オブジェクトを送信しているので、なぜあなたは 'バイト[]' – Ramanlfc

+0

を使用していません私は完全に間違っていない限り – Dak31

+0

あなたは "オブジェクト全体"と言うとき、どのような余分なフィールドを意味するのですか?明らかに画像自体(バイトの配列)がありますが、幅と高さなどを意味しますか?パレット?問題は、異なるプラットフォーム間でマルチバイト値を使用しようとするときです。ネットワーク上で 'int'sを送信するのは面倒です... –

答えて

1

PNGとして全体に画像を送信:

// BufferedImage -> byte sequence 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ImageIO.write(img, "PNG", baos); 
byte[] imageData = baos.toByteArray(); 
// byte sequence -> BufferedImage 
ByteArrayInputStream bais = new ByteArrayInputStream(imageData); 
BufferedImage img = ImageIO.read(bais); 
1

基本的にBufferedImageは配列です。ピクセルは配列であるDataBufferに格納されます。

BufferedImage source = //... 
switch (source.getType()) 
    { 
    case BufferedImage.TYPE_BYTE_GRAY : 
    case BufferedImage.TYPE_3BYTE_BGR : 
    case BufferedImage.TYPE_4BYTE_ABGR : 
     final byte[] bb = ((DataBufferByte)source.getRaster().getDataBuffer()).getData() ; 
     //... 
     break ; 
    case BufferedImage.TYPE_USHORT_GRAY : 
     final short[] sb = ((DataBufferUShort)source.getRaster().getDataBuffer()).getData() ; 
     //... 
     break ; 
    case BufferedImage.TYPE_INT_RGB : 
    case BufferedImage.TYPE_INT_BGR : 
    case BufferedImage.TYPE_INT_ARGB : 
     final int[] ib = ((DataBufferInt)source.getRaster().getDataBuffer()).getData() ; 
     break ; 
    // etc. 
    } 

また、画像のサイズとチャンネル数を送信する必要があります。

+0

を見ていますネットワーク上で(PNG圧縮されたデータと比較して)転送されなければならない大きな配列(そして画像そのもののサイズを知っていない*)を持っているという欠点はすでにコメントに記載されていました。さらに、このようにデータバッファデータを取得すると、イメージは「追跡不能」(「アンマネージド」と呼ばれることもある)になり、このイメージのペイントパフォーマンスを大幅に低下させる可能性があります。それ以外は、質問者が意図したアプローチが最良かどうかにかかわらず、これは質問に対する合理的な答えです。 – Marco13

+0

はい、私は基本的な質問に答えていました "画像をint []に変換しています"そして、はい、圧縮されたデータを送信する方がはるかに高速です。 – FiReTiTi

関連する問題