保持图像质量

And*_*son 4 c# image-processing

我有一个winform C#桌面应用程序.

我有一个恒定的jpeg流进来.我正在比较当前的图像与之前的1.通过使用第三方工具 - Emgu - 我可以创建一个只包含差异的新图像.

然后我将该图像转换为内存流,然后转换为字节数组.

在接收应用程序中,我使用这个字节数组并使用这些字节通过内存流加载图像.

问题是图像降级了很多.

如果我将图像保存到硬盘驱动器,然后将其转换为客户端的内存流,则图像质量良好.

问题在于我将其作为内存流加载.

我把它编码为jpeg.
如果我在发送到服务器之前将其编码为PNG,则质量再次良好.编码为PNG的麻烦在字节数组中的大小就会出现问题.

我的意图一直是减少我必须上传的字节数以改善响应时间.

我做错了什么还是不能做到这一点?

这是我的代码:

Bitmap imgContainingDifference
    = GetDiffFromEmgu(CurrentJpegImage, PreviousJpegImage);

using (System.IO.MemoryStream msIn = new System.IO.MemoryStream())
{
  holding.Save(msIn, System.Drawing.Imaging.ImageFormat.Jpeg);
  data = msIn.ToArray();
}

//test here
using (System.IO.MemoryStream msOut = new System.IO.MemoryStream(_data))
{
   Bitmap testIMG = (Bitmap)Image.FromStream(msOut);
}

//result is image is poor/degrades
Run Code Online (Sandbox Code Playgroud)

如果我这样做:

using (System.IO.MemoryStream msIn = new System.IO.MemoryStream())
{
  holding.Save(msIn, System.Drawing.Imaging.ImageFormat.Png);
  data = msIn.ToArray();
}

using (System.IO.MemoryStream msOut = new System.IO.MemoryStream(_data))
{
   Bitmap testIMG = (Bitmap)Image.FromStream(msOut);
}

//Image is good BUT the size of the byte array is 
//10 times the size of the CurrentFrame right at the start.
Run Code Online (Sandbox Code Playgroud)

这是使用孩子建议时图像的样子:

在此输入图像描述

我现在尝试使用来自@MagnatLU的类型建议的编码器,如果我使用FreeImage.Net,我也可以获得相同质量的图像.

Mag*_*tLU 5

您可以在将文件编码为值时设置JPEG压缩级别,这是质量和大小之间最佳的经验权衡.