2012-12-21 35 views
8

我有一個RenderTargetBitmap,我需要將其轉換爲BitmapImage。請檢查下面的代碼。轉換RenderTargetBitmap到BitmapImage的

RenderTargetBitmap bitMap = getRenderTargetBitmap(); 
Image image = new Image();// This is a Image 
image.Source = bitMap; 

在上面的代碼中我使用了Image.Now,我需要使用BitmapImage。我怎樣才能做到這一點?

RenderTargetBitmap bitMap = getRenderTargetBitmap(); 
BitmapImage image = new BitmapImage();// This is a BitmapImage 
// how to set bitMap as source of BitmapImage ? 
+0

喬治,我需要將RenderTargetBitmap轉換爲BitmapImage。 – sharmila

+0

可能重複:[RenderTargetBitmap到的BitmapImage在WPF(http://stackoverflow.com/questions/3361579/rendertargetbitmap-to-bitmapimage-in-wpf) – khellang

+2

類似的東西:http://msdn.microsoft.com/en -us/library/aa969819.aspx – GeorgesD

回答

14

雖然似乎是必要的RenderTargetBitmap轉換爲BitmapImage沒有,你可以很容易地編碼RenderTargetBitmapMemoryStream,並從流解碼BitmapImage

有幾種BitmapEncoders在WPF,下面的示例代碼使用PngBitmapEncoder

var renderTargetBitmap = getRenderTargetBitmap(); 
var bitmapImage = new BitmapImage(); 
var bitmapEncoder = new PngBitmapEncoder(); 
bitmapEncoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap)); 

using (var stream = new MemoryStream()) 
{ 
    bitmapEncoder.Save(stream); 
    stream.Seek(0, SeekOrigin.Begin); 

    bitmapImage.BeginInit(); 
    bitmapImage.CacheOption = BitmapCacheOption.OnLoad; 
    bitmapImage.StreamSource = stream; 
    bitmapImage.EndInit(); 
} 
+0

由於MSDN認爲只要hte映像處於活動狀態,流必須保持打開狀態,因此可能存在問題。在離開使用塊之前可能的解決方案是使用Clone()或WriteableBitmap和Freeze從圖像中斷開流。 –

+0

re:懷疑這是必要的 - 當你有一種類型並且想要調用只存在於另一種類型中的方法或屬性時,這是必要的。例如,RTB.Render或BI.Rotation。它們都來自BitmapSource的事實很好,但非物質的。 –

+0

@JesseChisholm當設置BitmapCacheOption.OnLoad時,流不需要保持打開狀態。請參閱備註[此處](http://msdn.microsoft.com/zh-cn/library/system.windows.media.imaging.bitmapimage.cacheoption.aspx):'如果希望關閉,請將CacheOption設置爲BitmapCacheOption.OnLoad一個用於創建BitmapImage'的流。而且「當你有一種類型並且想要調用只存在於另一種類型中的方法或屬性時,這是非常必要的」:非常明顯,但是OP沒有明確提及任何特殊用途,也沒有回答我關於此問題的問題。 – Clemens

-2
private async void Button_Click(object sender, RoutedEventArgs e) 
{ 
    RenderTargetBitmap bitMap = new RenderTargetBitmap(); 
    await bitMap.RenderAsync(grid); 
    Image image = new Image();// This is a Image 
    image.Source = bitMap; 
    image.Height = 150; 
    image.Width = 100; 

    grid.Children.Add(image); 
} 

這看起來是一個簡單的解決方案。

+1

請用英文回答問題並作爲單獨問題提問(或者在您有足夠信譽時通過評論提問) – YakovL

+0

這甚至不是一個解決方案(儘管更簡單),因爲它不會像創建BitmapImage一樣在問題中。 – Clemens