【发布时间】:2013-11-23 20:02:42
【问题描述】:
我有一个 winform C# 桌面应用程序。
我有源源不断的 jpeg 流入。 我正在将当前图像与前一个图像进行比较。 通过使用第 3 方工具 - 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.
这是使用来自以下的孩子建议时的图像:
我现在尝试使用来自@MagnatLU 的善意建议的编码器,如果我使用 FreeImage.Net,我也可以获得相同质量的图像。
【问题讨论】:
-
你要求你的蛋糕也吃。如果使用 Jpeg 等有损压缩,图像质量会下降。如果您使用无损压缩(例如 PNG),图像质量将保持不变,但尺寸预计会增加。你不能同时拥有它。
-
您好,感谢您的反馈。问题是原始图像是jpeg。我只是比较两个图像之间的差异,以相同的格式(jpeg)再次保存它,然后重建当前帧(作为 jpeg)并过度施加像素变化。除了 jpeg 之外,我从来没有在任何时候进行加载、比较和保存。据观察,当以 PNG 格式保存内存流中的更改时,质量还可以。我现在所能想到的是,这个进行比较的第 3 方工具实际上是在 png 中加载图像来进行比较。
-
初始图像也是 Jpeg 并不重要。如果您在 photoshop 中加载 jpeg 并将其保存回 jpeg,则结果的质量将低于原始质量。每次压缩迭代都会进一步降低质量,就像你制作了一个施乐的一个施乐的施乐。
-
你好。我懂了。多么痛苦啊:(
标签: c# image-processing