2013-11-23 72 views
3

我有一个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 

如果我这样做,而不是:

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. 

这是图像的外观使用从孩子的建议时,如:

enter image description here

我现在已经尝试使用来自@Ma的那种建议的编码器如果我使用FreeImage.Net,gnatLU和我也可以获得相同质量的图像。

+1

你想要吃你的蛋糕,也吃它。如果使用Jpeg等有损压缩,图像质量会降低。如果您使用无损压缩(如PNG),图像质量将保持不变,但尺寸预计会增加。你不能双方都有。 – Rotem

+0

嗨,感谢您的反馈。原来的图像是jpeg。我只比较两张图像之间的差异,再次以相同格式(jpeg)保存它,然后重建当前帧(作为jpeg)并过度施加像素变化。在任何时候,我都在做除jpeg之外的任何加载,比较和保存工作。这是一种观察结果,当以PNG格式保存内存流中的更改时,质量是确定的。我现在所能想到的是,这个比较的第三方工具实际上是将图片加载到png中来做到这一点。 –

+1

最初的图片也是Jpegs,并不重要。如果您在photoshop中加载jpeg并将其保存为jpeg,则结果将比原始结果低。每次压缩迭代都会进一步降低质量,就像您制作施乐公司的施乐公司的施乐公司一样。 – Rotem

回答

4

当您将文件编码为最佳经验权衡值时,您可以设置JPEG compression level

+0

嗨,感谢您的回复。我尝试过,虽然质量有所提高,但仍然太糟糕,不幸的是,使用。 –