2012-01-10 66 views
2

我想寫一個函數,將得到作爲輸入字符串fileName並返回ImageDrawing對象。
我不想在此函數中從磁盤加載位圖。相反,我想要進行某種懶惰的評估。 爲了找出尺寸,我使用位圖類。我該如何實現懶惰的位圖加載?

目前我有這樣的代碼:

public static ImageDrawing LoadImage(string fileName) 
    { 
     System.Drawing.Bitmap b = new System.Drawing.Bitmap(fileName); 
     System.Drawing.Size s = b.Size ; 
     System.Windows.Media.ImageDrawing im = new System.Windows.Media.ImageDrawing(); 
     im.Rect = new System.Windows.Rect(0, 0, s.Width, s.Height); 
     im.ImageSource = new System.Windows.Media.Imaging.BitmapImage(new Uri(fileName, UriKind.Absolute)); 
     return im;    
    } 
  1. 是調用System.Drawing.Bitmap構造懶惰?
  2. 是否打電話給。尺寸懶惰?
  3. BitmapImage構造函數是否懶惰?
  4. 有沒有其他的方式可以讓我完全懶惰?

編輯: 有很多很好的答案,可能是有幫助的社區 - 使用懶惰類,並與任務打開它。
不過,我想把這個ImageDrawing一個DrawingGroup內部事後序列化,所以以及任務不是我的選擇。

+1

相關:http://stackoverflow.com/questions/552467/how-do-i-reliably-get-an-image-dimensions-in-net-without-loading-the-image – 2012-01-10 15:58:31

回答

1

我建議在你的班級中使用Timer並以「懶惰」的方式下載你的圖片。您也可以嘗試執行MS TPL的任務,以在定時器滴答事件中執行此操作。

+0

感謝建議,它可能對別人有用 - 所以(+1)。對我來說,它並不是很有用,因爲我需要序列化BitmapImage,而且我不想序列化任務 – 2012-01-10 16:22:03

+0

我看到了......那麼......然後在沒有任務的情況下執行操作。但是,您可以嘗試重新查看您的班級並實施您需要的所有內容。事實上,要做一些工作的班級應該是另一個班級。並保持你的數據/圖像在沒有任何轉換方法的課堂上。我的意思是嘗試分​​割數據和方法來操縱它到2差異。類。 – 2012-01-10 16:27:54

4

Bitmap類的構造函數是不是懶惰,但你可以使用Lazy<T>類,這是正是出於這個目的而作出:

public static Lazy<ImageDrawing> LoadImage(string fileName) 
{ 
    return new Lazy<ImageDrawing>(() => { 
     System.Drawing.Bitmap b = new System.Drawing.Bitmap(fileName); 
     System.Drawing.Size s = b.Size; 
     System.Windows.Media.ImageDrawing im = new System.Windows.Media.ImageDrawing(); 
     im.Rect = new System.Windows.Rect(0, 0, s.Width, s.Height); 
     im.ImageSource = new System.Windows.Media.Imaging.BitmapImage(new Uri(fileName,  UriKind.Absolute)); 
     return im; 
    }); 
} 

從文檔(http://msdn.microsoft.com/en -us /庫/ dd997286.aspx):

雖然你可以編寫自己的代碼來執行延遲初始化,我們建議您使用懶惰代替。懶惰及其相關類型也支持線程安全並提供一致的異常傳播策略。

+0

(+1)爲社區提供有用的答案。但是對我來說這並不是特別好,我已經更新了我的問題 - 請檢查一下 – 2012-01-10 16:45:55

+0

當我嘗試使用此代碼序列化一個實例時。 .PNG「); Stream stream = File.Open(「Serialized.osl」,FileMode.Create); BinaryFormatter bformatter = new BinaryFormatter(); bformatter.Serialize(stream,img); stream.Close(); ' ...我得到'System.Windows.Media.ImageDrawing'不可序列化的錯誤消息。這就是沒有'Lazy'包裝的情況下得到的相同信息......無論如何,你如何試圖序列化這個東西? – 2012-01-10 16:46:37

+0

使用XAMLWriter – 2012-01-10 16:49:09