0

カメラからプレビュー画像をキャプチャして、wifi経由でコンピューターに送信しようとしています。

プロセスは次のとおりです。

私の電話の場合:カメラのプレビューを開始し、圧縮してtcp接続で送信します。私のコンピューターの場合:圧縮データを受信して​​写真を保存します。

私はモバイルでこのコードを使用しています:

try {           
    ByteArrayOutputStream outstr = new ByteArrayOutputStream();

    Camera.Parameters parameters = camera.getParameters();
    Size size = parameters.getPreviewSize();
    YuvImage image = new YuvImage(data, parameters.getPreviewFormat(), size.width, size.height, null);
    image.compressToJpeg(new Rect(0, 0, image.getWidth(), image.getHeight()), 100, outstr);

    out.writeBytes("DATA|" + outstr.size() + "\n");
    out.flush();
    out.write(outstr.toByteArray());
    out.flush();

    } catch (IOException e) {
        t.append("ER: " + e.getMessage());
    }

outがメソッドでDataOutputStream作成される場所onCreate

tcp = new Socket("192.168.0.12", 6996);         
in = new BufferedReader(new InputStreamReader(tcp.getInputStream()));
out = new DataOutputStream(tcp.getOutputStream());

次に、私のコンピューターでこのコードを使用します。

    StreamReader sr = new StreamReader(client.GetStream());
    string line = sr.ReadLine();

    if(line.StartsWith("DATA"))
    {
        piccount++;
        int size = Convert.ToInt32(line.Substring(5));
        Console.WriteLine("PHOTO, SIZE: " + size + ", #: " + piccount);
        byte[] data = new byte[size];

        client.GetStream().Read(data, 0, size);

        FileStream fs = System.IO.File.Create("C:/Users/M/photo"+piccount+".jpeg"); 
        fs.Write(data, 0, data.Length);
        fs.Flush();
        fs.Close();
    }

問題は、送信された画像の一部は問題ありませんが、一部が破損していることです。問題はどこにありますか?

4

1 に答える 1

1

問題はこの行にありclient.GetStream().Read(data, 0, size);ます。正確にバイトStream.Readを読み取ることを保証するものではありません。sizeその戻り値を確認し、すべてのバイトが読み取られるまで読み取りを続行する必要があります。

http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx

戻り値

バッファに読み込まれた合計バイト数。これは、その数のバイトが現在使用可能でない場合は要求されたバイト数より少なくすることができ、ストリームの終わりに達した場合はゼロ(0)にすることができます。

ストリーム全体を読み取ることを目的としている場合は、次のコードを使用できます。

using (FileStream fs = System.IO.File.Create("C:/Users/M/photo" + piccount + ".jpeg"))
{
    client.GetStream().CopyTo(fs);
}
于 2012-12-30T13:39:59.230 に答える