保护图像质量

4
我有一个Winform C#桌面应用程序。
我有不断涌入的JPG图片流。 我正在将当前图像与先前的图像进行比较。 通过使用第三方工具-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

如果我这样做:

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.

使用来自Kid建议的图像,其外观如下所示:

enter image description here

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


1
你想要占全,又想吃饱。如果使用像JPEG这样的有损压缩,图像质量会降低。如果使用像PNG这样的无损压缩,图像质量将保持不变,但是文件大小预计会增加。你不能两全其美。 - Rotem
嗨,感谢反馈。问题在于原始图像是jpeg格式。我只比较两个图像之间的差异,再以相同的格式(jpeg)保存它,然后重建当前帧(作为jpeg),并覆盖像素更改。在任何时候,我都没有使用除jpeg以外的其他格式进行加载、比较和保存。当我以PNG格式将更改保存在内存流中时,观察到质量还不错。现在我能想到的就是这个进行比较的第三方工具实际上正在使用PNG加载图像来进行比较。 - Andrew Simpson
1
初始图像也是Jpeg格式并不重要。如果您在Photoshop中加载Jpeg并将其保存回Jpeg,则结果的质量将低于原始质量。每次压缩迭代都会进一步降低质量,就像复印一份复印件一样。 - Rotem
嗨,又见面了。我明白了。真是太糟糕了 :( - Andrew Simpson
1个回答

5

在编码文件时,您可以设置JPEG压缩级别,以获得最佳的质量和大小之间的经验权衡。


嗨,感谢您的回复。我尝试了一下,虽然质量有所提高,但仍然不够好,无法使用。 - Andrew Simpson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接