2017-05-05 12 views
0

私は1つのInputStream経由で画像を受信するソケットを持っていません。私はそのように大胆にイメージを送りたい。しかし、今度は画像が1枚の画像の遅延で受信されます(2枚目を送信した後の最初の画像、3枚目を送信した後の画像、....)。私は間違って何をしていますか?ソケットレシーブ遅延1の画像

サーバー

public static void readImages(InputStream stream) throws IOException { 
    stream = new BufferedInputStream(stream); 
    BufferedImage image = null; 
    int j = 0; 

    while (true) { 

     stream.mark(MAX_IMAGE_SIZE); 

     ImageInputStream imgStream = ImageIO.createImageInputStream(stream); 
     Iterator<ImageReader> i = ImageIO.getImageReaders(imgStream); 
     if (!i.hasNext()) { 
      System.out.println("No more image readers"); 
      break; 
     } 

     ImageReader reader = i.next(); 
     reader.setInput(imgStream); 

     image = reader.read(0); 
     ImageIO.write(image,"jpg",new File("current" + j + ".jpg")); 
     System.out.println("Save an image " + j); 


     if (image == null) { 
      System.out.println("Image is null"); 
      break; 
     } 

     long bytesRead = imgStream.getStreamPosition(); 

     stream.reset(); 
     stream.skip(bytesRead); 
     j++; 
    } 
} 

クライアント

new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 

        OutputStream outputStream = server.getOutputStream(); 
        ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
        bitmapToSend = Bitmap.createScaledBitmap(bitmapToSend, 900, 800, true); 
        bitmapToSend.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
        byte[] byteArray = stream.toByteArray(); 
        outputStream.write(byteArray); 
        outputStream.flush(); 
       } catch (IOException e) { 
        System.out.println("Socket not created"); 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 

注私は、クライアントの出力ストリームを閉じてはいけないので、私は絵のすべての時間を送ることができます。

+0

あなたは第二または第三の画像を送信するためにどのようなコードを使用していますか? – greenapps

+0

私はカメラで画像(bufferedImage)を撮影し、それをbitmapToSendに割り当てます。残りは「クライアント」スニペット –

+1

ええ、すでにシアン化物の答えで実装されていますが、問題があります。私はそれを以下のコメントに入れました。 –

答えて

0

ImageIO.getImageReaders(imgStream)を使用すると、ソケットストリームでは論理的に見えません。おそらく、すべての画像を一度に使用できると考えられるからです。それがあなたの遅れの理由かもしれません。

第2に、画像を解凍するには、単純なメソッドBitmapFactory.decodeStream()があります。

第3に、クライアントはすでに「JPG」形式を作成しているため、サーバーは単にそれを保存するだけです。すべてのファイルが送信されたら、最初にバイト数とゼロを送信する必要があります。

クライアント:

new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       ByteArrayOutputStream memoryStream = new ByteArrayOutputStream(); 
       Bitmap bitmapToSend = 
        Bitmap.createScaledBitmap(bitmapToSend, 900, 800, true); 
       bitmapToSend.compress(
        Bitmap.CompressFormat.JPEG,100, memoryStream); 
       byte[] byteArray = memoryStream.toByteArray(); 
       memoryStream = null; 

       DataOutputStream outputStream = 
          new DataOutputStream(server.getOutputStream()); 
       outputStream.writeInt(byteArray.length); 
       outputStream.write(byteArray); 
       outputStream.flush(); 
      } catch (IOException e) { 
       System.out.println("Socket not created"); 
       e.printStackTrace(); 
      } 
     } 
    }).start(); 

サーバー:

public static void readImages(InputStream stream) { 

    DataInputStream imgInput = new DataInputStream(stream); 
    int index = 0; 
    int byteLength; 

    try { 
     while ((byteLength = imgInput.readInt())>0) { 

      byte[] buffer = new byte[byteLength]; 
      imgInput.readFully(buffer); 

      OutputStream imgOutput = new FileOutputStream("current" + (index++) + ".jpg"); 
      imgOutput.write(buffer); 
      imgOutput.close(); 
     } 
    } catch (IOException ex) { 
     // ............. 
    } finally { 
     try { 
      imgInput.close(); 
     } catch (IOException ex1) { 
      //........... 
     } 
    } 

} 
+0

私のコードにメソッドを挿入しましたが、最初のイメージを送信してそこで停止します。画像は、2つの上の行の「有効な」ピクセルでのみ満たされ、残りは灰色になります。それは 'imgInput.readInt()'の問題でしょうか? –

+1

したがって、イメージは2番目の行の最後の有効なピクセルを繰り返します。 ImageIO経由でImageを印刷するだけで、完全なイメージが得られます。だから私はそれがwhileループの内部を保存することと関係していると思います。 –

+0

'imgInput.read(buffer)'はおそらく 'imgInput.readFully(buffer)'でしょう(または、より小さなバッファ)。いずれにせよ、バッファを完全に埋めるために 'imgInput.read(buffer)'に依存しないでください。 – haraldK

関連する問題