繁体   English   中英

Android通过TCP压缩和发送图像

[英]Android compressing and sending image via tcp

我正在尝试从相机捕获预览图像,然后通过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());
    }

onCreate方法中创建的DataOutputStream在哪里:

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();
    }

问题是,传输的图像有些可以,但是其中一些已损坏。 问题出在哪里?

问题出在这行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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM