2011-02-16 102 views
0

我知道存在類似的問題,但是我有一個關於在二進制列中存儲圖像的問題。保存時在二進制列中重新編碼Jpeg圖像

我有一個小窗口窗體應用程序,使用Linq2SQL從一個SQL壓縮數據庫加載圖像到一個圖片框控件。用戶可以拖動任意圖像(jpg,bmp,gif)到一個picturebox上。在DragDrop-Event上,圖像被加載到圖片框中。 當我保存下面的代碼執行存儲PictureBox控件的圖像記錄:

MemoryStream imgStream = new MemoryStream(); 
pictureBox1.Image.Save(imgStream, System.Drawing.Imaging.ImageFormat.Jpeg); 
myTable.MyImage = imgStream.ToArray(); 

我已經檢查了字節數組的大小,並保存記錄後,並沒有改變。 每次調用Save-Method時都會重新編碼圖像嗎?這可能會更好地檢查圖像是否已經改變。

回答

0

JPEG圖像被解碼爲它們被.NET顯示(或者幾乎任何東西)的函數。所以,如果你把一個JPEG作爲一個二進制文件輸出,把它放在一個PictureBox中(它將把它轉換成一個光柵格式來顯示),然後取得這個現在未壓縮的光柵圖像並重新壓縮它,最終你可能會更改圖片。

我會將顯示的圖像的原始字節流保留在幕後的某處,並在用戶保存數據時將其寫回數據庫。這不僅有助於保持圖像的完整性,還可以減少每次重新壓縮圖像的需求,從而提高性能。

+0

謝謝,你幫忙找出一個解決方案: 我比較字節數組(舊圖像和當前編碼)與SequenceEqual之前。 `如果(myTable.MyImage == NULL || myTable.MyImage.ToArray()SequenceEqual(imgStream.ToArray())!) myTable.MyImage = imgStream.ToArray();` – fnx 2011-02-16 18:56:48

0

如果在調用Save時調用此代碼,那麼是的,PictureBox每次都會將其自身導出爲JPEG格式。你是否注意到性能問題?如果您想避免它,請在應用程序加載時設置一個標誌,並在發生拖放事件時提升標誌,指示Save方法應更新圖像數據。

+0

對我而言,性能不是問題,我只是希望每次保存記錄時都避免質量下降。 – fnx 2011-02-16 19:00:46