0

BufferedImageaをに変換する必要がありますbyte[]が、遅すぎます。バイトは最終的にbase64でエンコードされ、Androidクライアントに送信されます。私が使用している方法は次のようなものです。

public static byte[] ImageToBytes(BufferedImage im) throws IOException
{

//make sure its NN
if(im!=null)
{

//create a ByteArrayOutputStream
ByteArrayOutputStream baos = new ByteArrayOutputStream();

//write our image to it
ImageIO.write( im, "png", baos );

//flush the stream
baos.flush();

//get the image in byte form
byte[] imageInByte = baos.toByteArray();

//close the stream
baos.close();

//return our value encoded in base64
return imageInByte;

}

return null;
}

これは私のプログラムには遅すぎます。をに変更するpngjpeg、モバイル側で失敗します。バージョンはJpegCodecモバイル側でも失敗します。失敗すると、AndroidメソッドがをBitmapFactory.decodeByteArray()返すことを意味しますnull

4

2 に答える 2

1

byte []への変換はオプションではないでしょう?「[it]は最終的にbase64でエンコードされ、Androidクライアントに送信されます」と言います。Base64OutputStreamのようなものでAndroidクライアントに書き込むためにOutputStreamをラップし、問題を完全に回避するのはどうですか?

于 2012-08-15T14:23:31.737 に答える
1

が遅すぎる理由はわかりません。また、このコードをBufferedImagePNGバイトストリームに変換する唯一の方法であるため、このコードを高速化するためにできることはあまりありません。しかし、ここにいくつかの指針があります:

  1. クラスByteArrayOutputStreamは同期されているため、パフォーマンスが大幅に低下します。Commons IOorg.apache.commons.io.output.ByteArrayOutputStream)でより高速な実装を見つけることができます

  2. 画像のサイズによっては、の割り当てアルゴリズムがByteArrayOutputStream問題になる場合があります。1または10KiBの初期サイズから始めます。

  3. toByteArray()既存のバッファのコピーを提供します。それが必要ない場合(通常は必要ありません)、独自に作成するOutputStreamと、速度がさらに向上する可能性があります(GCの実行を回避することは言うまでもありません) 。

于 2012-08-15T14:35:16.693 に答える