我正在尝试从相机捕获预览图像,然后通过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());
}
在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();
}
问题是,传输图片的索引是正常的,但其中一些已损坏。问题出在哪里?
答案 0 :(得分: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);
}