我猜你正在做的事情liek這樣的:
Bitmap bitmap = new Bitmap (filename of jpeg);
,然後做:
OnPaint (...)
{
Graphics g = ....;
g.DrawImage (bitmap, ...);
}
這將是調整的巨大JPEG圖像上每一次屏幕上顯示的尺寸你畫它。我猜你的JPEG大小約爲2500x2000像素。當您將JPEG加載到位圖中時,位圖加載代碼解壓縮數據並將其存儲爲可容易呈現的格式(即以與顯示器相同的像素格式)的RGB數據或作爲被稱爲設備獨立位圖(又名DIBitmap)。這些位圖需要比壓縮的JPEG存儲更多的RAM。
你目前的實現已經在做格式轉換和調整大小,但是以一種不合理的方式進行,即每次渲染時調整一個巨大的圖像到屏幕大小。
理想情況下,您想要加載圖像並將其縮小。 .Net有一個系統來執行此操作:
Bitmap bitmap = new Bitmap (filename of JPEG);
Bitmap thumbnail = bitmap.GetThumbnailImage (width, height, ....);
bitmap.Dispose(); // this releases all the unmanged resources and makes the bitmap unusable - you may have been missing this step
bitmap = null; // let the GC know the object is no longer needed
其中寬度和高度是所需縮略圖的大小。現在,這可能會產生看起來不夠好的圖像(但它會使用任何嵌入的縮略圖數據(如果存在的話會更快),在這種情況下,請執行位圖 - >位圖調整大小。
當您創建PDF文件時,您需要重新加載JPEG數據,但從用戶的角度來看,沒關係。我相信,只要您有一些反饋意見讓用戶知道正在處理數據,用戶不會介意等一會兒將數據導出爲PDF。您也可以在後臺線程中執行此操作,並讓用戶在另一個拼貼畫上工作。
所以......你需要一個有效的解決方案,但是你不想使用提高效率的方法,即在較低的層次上處理圖像?爲什麼不?我不知道Silverlight,希望你找到一個解決方案,但有時你實際上不得不捲起袖子做一些工作。 – 2010-03-15 23:58:53
問題只在於內存效率。我不需要快速渲染或快速修改圖像數據本身 - 我只需要使用不超過內存中的實際JPEG數據來表示它,並在稍後將它合併到PDF中。我使用的PDF框架需要我輸入JPEG數據流,但我沒有看到將BitmapImage轉換爲JPEG流的好方法。 – 2010-03-16 00:14:43
您可以包含一些關於程序如何工作的代碼,以及圖像的一般大小是什麼?您一次顯示多少個? – 2010-04-06 14:31:08