2016-04-22 23 views
0

私は単純なファイル転送アプリケーションを実装しようとしています。Bluetooth経由でJavaFXとAndroidを転送する画像

私のアプリはそのように行います。 1.キャプチャ現在のカメラのプレビューをアンドロイドに 2. JavaFXのアプリがそれを保存し、ウィンドウに表示画像を受信3. 4.いくつかの後にBluetooth経由でのJavaFXアプリケーションに送ります画像の上に描画することは、再びアンドロイドに

を送って、それをキャプチャする私は、ファイルサイズ、実際のデータとEOFが含まれているパケットの種類を作成した最初の

のAndroid側でこのように実装。

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    data.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
    // filesize + data + end of file 
    String fileSize = String.valueOf(baos.size()); 
    fileSize += '\0'; // end of the filesize string 
    String eof = "eof"; // end of packet 
    // set packet size 
    int packetSize = fileSize.length() + baos.size() + eof.length(); 
    ByteBuffer byteBuffer = ByteBuffer.allocate(packetSize); 
    byteBuffer.put(fileSize.getBytes()); 
    byteBuffer.put(baos.toByteArray()); 
    byteBuffer.put(eof.getBytes()); 

    byte[] data = new byte[byteBuffer.capacity()]; 
    byteBuffer.position(0); 
    byteBuffer.get(data); 

bytes = btIn.read(buffer); 
       // receive packet data 
       if (fileSize == null) { 
        for (int i = 0; i < bytes; i++) { 
         if (buffer[i] == '\0') { 
          fileSize = new String(buffer, 0, i); 
          break; 
         } 
        } 
       } 

       // eof offset 
       int offset = bytes - 3; 
       byte[] eofByte = new byte[3]; 
       eofByte = Arrays.copyOfRange(buffer, offset, bytes); 
       String message = new String(eofByte, 0, 3); 

       if (message.equals("eof")) { 
        eof = true; 
        fos.write(buffer, 0, bytes-3); 
       } else { 
        // set buffer size to file size 
        if (fileBuffer == null) { 
         fileBuffer = ByteBuffer.allocate(Integer.parseInt(fileSize)); 
         fileBuffer.put(buffer, fileSize.length()+1, bytes); 
         fos.write(buffer, fileSize.length()+1, bytes); 
        } else { 
         fileBuffer.put(buffer, 0, bytes); 
         fos.write(buffer, 0, bytes); 
         // for progress bar 
         percent = (float) fileBuffer.position()/(float) fileBuffer.capacity(); 
        } 
       } 

       log(String.valueOf(percent)); 

       if (eof) { 
        byte[] data = new byte[fileBuffer.capacity()]; 
        fileBuffer.position(0); 
        fileBuffer.get(data); 
        ByteArrayInputStream input = new ByteArrayInputStream(data); 
        bufferedImage = ImageIO.read(input); 
        image = SwingFXUtils.toFXImage(bufferedImage, null); 

        if (bufferedImage != null) { 
         log("got the image"); 
        } 

        // set null fileBuffer and fileSize for next images 
        fileSize = null; 
        fileBuffer = null; 
       } 
      } 

コード上に、JavaFXの側でのOutputStreamソケットを

をブルートゥースデータの送信は、Anroid

から画像をrecevingとJavaFXの上部分である送信するためのものです。

  WritableImage writableImage = new WritableImage((int)canvas.getWidth(), (int)canvas.getHeight()); 
      canvas.snapshot(null, writableImage); 
      BufferedImage bufferedImage = SwingFXUtils.fromFXImage(writableImage, null); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      try { 
       ImageIO.write(bufferedImage, "jpg", baos); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      byte[] imageInBytes = baos.toByteArray(); 
      log(String.valueOf(imageInBytes.length)); 
      bct.write(imageInBytes); 
      String eof = "end of file"; 
      byte[] eofbyte = eof.getBytes(); 
      bct.write(eofbyte); 

送信側と受信側の一部の作業罰金... しかし、私は、Androidとあなたが見る、SS、画像の最も左側から画像を受け取ったときにこれはJavaFXの側で結果画像上の問題

enter image description here

を持っていますこのようにAndroidでのJavaFX側からの結果の画像を画像をreceving後

よりweired

所望されない:

enter image description here

私の質問は正しい画像を取得するためにコードを修正する必要がありますか?

答えて

1

私はあなたがこのバグにより打撃を受けたと思う:

https://bugs.openjdk.java.net/browse/JDK-8041459

あなたはPNGの代わりにJPGを使用することで、この問題を回避することができます。もう1つの選択肢は、画像を保存する前にアルファ成分なしの画像に明示的に変換することです。

マイケル

+0

そうでした。アルファチャンネルのない画像を再保存することで修正しました。答えてくれてありがとう – kju

関連する問題