用于串行传输的C#图像压缩

时间:2016-05-23 23:58:24

标签: c# image serial-port compression

这是我的第一个问题,所以我希望能提供得到合适答案所需要的东西。

我想通过串行链接发送网络摄像头收到的图像。 Image被转换为字节数组,然后写入串口。

我遇到的第一个问题是,当我尝试发送图片时,它会导致TimeoutException。看一下字节数组的长度,它向我展示了需要传输的大约1 MB的数据。缩小图像的实际尺寸可以使传输速度更快,但之后图像太小了。

第二个问题是当我试图压缩图像时。使用不同的方法,传输的大小总是完全相同。

我希望你能帮助我找到一种方法来改进我的实现,这样传输只需要几秒钟,同时仍然保持合理的图像分辨率。谢谢。

<小时/>

具体信息

网络摄像头图像

  • 来自网络摄像头的图像由AForge图书馆
  • 接收
  • 图像作为位图处理
  • (显然)它不会传输每一帧,只需点击一下按钮

串口

  • 端口使用57600 bps的波特率(由下面的硬件定义)
  • WriteTimeout - 值设置为30秒,因为等待时间超过
  • 是不可接受的
  • 文本传输使用WinForm
  • 中SerialPort项目的默认值

图像处理

我使用不同的方法来压缩图像:

这样的简单方法
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);
}

2 个答案:

答案 0 :(得分:0)

C挂起串口的超时属性可以解决超时问题。如何在此链接https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.writetimeout(v=vs.110).aspx中显示。文件压缩的​​工作原理是查看数据块并将相似的块相互关联以用于给定的块段。如果您的图像太独特,则根据所使用的压缩软件不会压缩。

答案 1 :(得分:-1)

将整个数组拆分为一些较小的块并逐个发送是不是一个坏主意?