2012-12-21 11 views
8

Mam RenderTargetBitmap, muszę go przekonwertować do BitmapImage. Sprawdź poniższy kod.Konwersja RenderTargetBitmap do BitmapImage

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

W powyższym kodzie użyłem Image. Teraz potrzebuję użyć BitmapImage. Jak mogę to zrobić?

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

Georges, muszę konwertować RenderTargetBitmap do BitmapImage. – sharmila

+0

Możliwy duplikat: [RenderTargetBitmap do BitmapImage w WPF] (http://stackoverflow.com/questions/3361579/rendertargetbitmap-to-bitmapimage-in-wpf) – khellang

+2

coś takiego: http://msdn.microsoft.com/en -us/library/aa969819.aspx – GeorgesD

Odpowiedz

14

Chociaż nie wydaje się konieczne, aby przekształcić RenderTargetBitmap w BitmapImage, można łatwo zakodować RenderTargetBitmap w MemoryStream i zdekodować BitmapImage z tego strumienia.

Istnieje kilka BitmapEncoders w WPF, przykładowy kod poniżej używa 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

Mogą to być problemy, ponieważ MSDN mówi, że strumień musi pozostać otwarty, dopóki obraz jest żywy. Możliwe rozwiązania przed opuszczeniem bloku używają Clone() lub WriteableBitmap i Freeze, aby odłączyć strumień od obrazu. –

+0

ponownie: wątpliwość jest konieczna - jest to konieczne, gdy masz jeden typ i chcesz wywołać metodę lub właściwość, która istnieje tylko w drugim typie. Np. RTB.Render lub BI.Rotation. Fakt, że oba pochodzą z BitmapSource jest miły, ale nieistotny. –

+0

@JesseChisholm Strumień nie musi pozostawać otwarty po ustawieniu 'BitmapCacheOption.OnLoad'. Zobacz opis [tutaj] (http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.bitmapimage.cacheoption.aspx): 'Ustaw CacheOption do BitmapCacheOption.OnLoad, jeśli chcesz, aby zamknąć strumień używany do tworzenia obrazu bitmapowego. I "jest to konieczne, gdy masz jeden typ i chcesz wywołać metodę lub właściwość, która istnieje tylko w innym typie": bardzo oczywiste, ale OP nie wymienił wyraźnie żadnego specjalnego zastosowania i nie odpowiedział na moje pytanie dotyczące tego. – 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); 
} 

To wygląda jak prostszym rozwiązaniem.

+1

Proszę odpowiedzieć po angielsku i zadawać pytania jako oddzielne pytania (lub przez komentarze, gdy masz wystarczającą reputację). – YakovL

+0

To wcale nie jest rozwiązanie (mimo prostszego), ponieważ nie tworzy obrazu bitmapowego, o co poprosiliśmy w pytaniu. – Clemens