0

Android デバイスから PC で実行されている Java アプリに画像を送信するアプリを作成しています。クライアント側(Android)の画像は で、ブルートゥース経由でサーバーに送信するためにBitmapに変換します。Byte Array

 ByteArrayOutputStream baos = new ByteArrayOutputStream();  
 ImageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);     
 byte[] b = baos.toByteArray();
 mBluetoothService.write(b);

ビットマップは既に圧縮されたファイルから取得されるため、再度圧縮する必要はありません。

サーバー(Java)で次のコードを使用します。

  byte[] buffer = new byte[1024*1024];
  int bytes;
  bytes = inputStream.read(buffer);
  ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
  BufferedImage image = ImageIO.read(bais);
  ImageIO.write(image, "jpg", new File("c:/users/image.jpg"));

クライアント側にエラーはありません。しかし、サーバー側(Javaアプリ)でこの例外が発生します:

java.lang.IllegalArgumentException: im == null!

javax.imageio.ImageIO.write (不明なソース) で

javax.imageio.ImageIO.write (不明なソース) で

com.luugiathuy.apps.remotebluetooth.ProcessConnectionThread.run (ProcessConnectionThread.java:68) で

java.lang.Thread.run で (不明なソース)

したがって、ImageIO.read()何も返されません。バイト配列を画像として認識していないようです。インターネットで検索しましたが、これを解決するのに役立つものは何もありません。誰にもアイデアはありますか?

どうもありがとう!!

4

1 に答える 1

0

やっと理解できました!クライアント(Android)が受信用のスレッドと書き込み用のスレッドを作成することがあります。したがって、画像を送信すると、チャンクで送信されます。つまり、Android OS によって書き込みスレッドが時々一時停止されるため、サーバー側 (Java アプリ) の inputStream は、画像がバラバラになっていることを認識します。そのためImageIO.read()、画像を正常に読み取るのではなく、その一部であり、「java.lang.IllegalArgumentException: im == null!」が発生するのは、チャンクだけで画像を作成できないためです。

解決:

画像に加えて、「ファイルの終わり」文字列もサーバーに送信するため、ファイルがいつ完成したかがわかります(これにはもっと良い方法があると思いますが、これは機能しています)。サーバー側では、while ループですべてのバイト チャンクを受信し、「ファイルの終わり」を受信するまでそれらをすべてまとめます。コード:

Android クライアント:

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);     
    byte[] b = baos.toByteArray();
    mBluetoothService.write(b);
    mBluetoothService.write("end of file".getBytes());

Java サーバー:

    byte[] buffer = new byte[1024];

    File f = new File("c:/users/temp.jpg");
    FileOutputStream fos = new FileOutputStream (f);

    int bytes = 0;
    boolean eof = false;

    while (!eof) {

        bytes = inputStream.read(buffer);
        int offset = bytes - 11;
        byte[] eofByte = new byte[11];
        eofByte = Arrays.copyOfRange(buffer, offset, bytes);
        String message = new String(eofByte, 0, 11);

        if(message.equals("end of file")) {

            eof = true;

        } else {

            fos.write (buffer, 0, bytes);

        }

    }
    fos.close();

それが誰かに役立つことを願っています。

于 2012-10-10T13:57:54.837 に答える