2013-11-23 74 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

嗨,感謝您的回覆。我嘗試過,雖然質量有所提高,但仍然太糟糕,不幸的是,使用。 –