这是我的第一个问题,所以我希望能提供得到合适答案所需要的东西。
我想通过串行链接发送网络摄像头收到的图像。 Image被转换为字节数组,然后写入串口。
我遇到的第一个问题是,当我尝试发送图片时,它会导致TimeoutException
。看一下字节数组的长度,它向我展示了需要传输的大约1 MB的数据。缩小图像的实际尺寸可以使传输速度更快,但之后图像太小了。
第二个问题是当我试图压缩图像时。使用不同的方法,传输的大小总是完全相同。
我希望你能帮助我找到一种方法来改进我的实现,这样传输只需要几秒钟,同时仍然保持合理的图像分辨率。谢谢。
WriteTimeout
- 值设置为30秒,因为等待时间超过我使用不同的方法来压缩图像:
像
这样的简单方法public static byte[] getBytes(Bitmap img)
{
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] output = ms.toArray();
ms.Dispose();
return output;
}
以及更高级的方法,例如发布here的方法。不仅适用于Encoder.Quality
,还适用于Encoder.Compression
。
private void btn_Send(...)
{
Bitmap currentFrame = getImageFromWebcam();
//Bitmap sendFrame = new Bitmap(currentFrame, new Size(currentFrame.Width/10, currentFrame.Height/10));
Bitmap sendFrame = compressImage(currentFrame);
byte[] data = getBytes(sendFrame);
serialPort.Write(data, 0, data.Lenght);
}
答案 0 :(得分:0)
C挂起串口的超时属性可以解决超时问题。如何在此链接https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.writetimeout(v=vs.110).aspx中显示。文件压缩的工作原理是查看数据块并将相似的块相互关联以用于给定的块段。如果您的图像太独特,则根据所使用的压缩软件不会压缩。
答案 1 :(得分:-1)
将整个数组拆分为一些较小的块并逐个发送是不是一个坏主意?