2016-09-14 53 views
0

我正在將大量位圖(屏幕截圖)保存到內存中。沒有什麼特別的代碼,這是微不足道的:哪個編解碼器用於將位圖快速保存到內存

var memory = new MemoryStream(); 
bitmap.Save(memory, ImageFormat.Png); 

由於我的電腦是有點慢,我已經運行在Visual Studio中的性能分析會話,我發現了Save()調用需要「包容性樣本的37% 」。保存到磁盤時使用另一個大的部分,所以當不保存到磁盤時,這37%更可能是80%。 (我現在不在乎保存到磁盤,所有數據都保存在RAM中,直到按下熱鍵,我幾乎不會影響硬盤速度。)

從我的理解中,Save()調用必須轉換或多或少將位圖的「原始」數據轉換爲壓縮的PNG文件格式。

我想知道是否有人對Save()方法的處理時間有不同的圖像格式的性能概述。我想選擇最快的格式,即使文件大小較大。

我曾嘗試:

ImageFormat.MemoryBmp 

但拋出ArgumentNullException

值不能爲空。參數名稱:編碼器

我發現a related question,它描述了一些圖像格式是隻讀的,這會使列表減少一點。

+0

作爲一個粗略的經驗法則,壓縮是昂貴的。因此,將圖像保存到內存(或磁盤)的最快格式將涉及任何壓縮。可能...... –

+0

這取決於你沒有提到的因素。如果問題是您需要在有限的時間段內儘可能快地截圖,您可以通過在RAM中累積屏幕截圖,直到完成採集並最終寫入磁盤,做得更好。如果您的磁盤相對於您的CPU非常慢,則可能需要花費時間進行壓縮以減少磁盤I/O的容量。如果你的代碼是串行和順序的,那麼可能值得使用多線程,並且有一個線程獲取圖像,另一個線程並行地將它們保存到磁盤。 –

+0

@MarkSetchell:我已經這麼做了。 MemoryStream在RAM中,不是嗎? –

回答

1

這些是在英特爾i7 CPU上截取3臺顯示器的非典型結果,其中應用程序僅分配了一個內核。我正在運行一個x64發佈版本並保存到預先分配的內存緩衝區中。

GIF : ~5.5% CPU load 
TIFF: ~4.5% CPU load 
PNG : ~4.0% CPU load 
JPG : ~2.0% CPU load (note that this is lossy) 
BMP : ~1.0% CPU load 

我也試過整合Magick.NET,但因爲我無法弄清楚如何從MagickImage爲了節省截圖創建Graphics對象,我不得不使用取Bitmap作爲參數的構造。這導致PNG圖像的CPU負載約10.0%。

+0

過去某個地方與您一樣做了類似的基準測試,目標是在低規格硬件的情況下,在一秒鐘內編碼幾十張圖像。因此,[MJPEG](https://en.wikipedia.org/wiki/Motion_JPEG) – Martheen