2015-10-05 8 views
0

Как преобразовать RenderTargetBitmap в BitmapImage в C# XAML, Windows 8.1?Преобразование RenderTargetBitmap в BitmapImage

Я попытался

// rendered is the RenderTargetBitmap 
BitmapImage img = new BitmapImage(); 
InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream(); 
await randomAccessStream.WriteAsync(await rendered.GetPixelsAsync()); 
randomAccessStream.Seek(0); 
await img.SetSourceAsync(randomAccessStream); 

Но он всегда дает ошибку в

img.SetSourceAsync(randomAccessStream); 

Есть много способов, в WPF, но в WinRT? Как я могу это сделать ?

Большое спасибо!

ответ

1

Вы пробовали это:

var bitmap = new RenderTargetBitmap(); 

    await bitmap.RenderAsync(elementToRender); 

    image.Source = bitmap; 

Ссылка: http://social.technet.microsoft.com/wiki/contents/articles/20648.using-the-rendertargetbitmap-in-windows-store-apps-with-xaml-and-c.aspx

UPDATE:

Еще Refs .. может помочь:

UPDATE 2:

Попробуйте это:

private async Task<BitmapImage> ByteArrayToBitmapImage(byte[] byteArray) 
    { 
     var bitmapImage = new BitmapImage(); 

     var stream = new InMemoryRandomAccessStream(); 
     await stream.WriteAsync(byteArray.AsBuffer()); 
     stream.Seek(0); 

     bitmapImage.SetSource(stream); 
     return bitmapImage; 
    } 

Ref: C# Windows 8 Store (Metro, WinRT) Byte array to BitmapImage

+0

чувак спасибо, да, но я просто хочу, чтобы randomAccessStream и всегда сбоев или потоков любого типа: DI просто нужны байты или потоки, которые я могу использовать позже, чтобы создать другие битовые изображения –

+1

Что такое сообщение об ошибке или тип исключения? любые скриншоты? .. Отвечено обновлено –

+0

http://imgur.com/k7xldZw спасибо :) также в этот момент размер потока 0 –

1

это тот, который работал Sharing render to bitmap image in windows phone 8.1

т urned, что я просто не могу заполнить поток непосредственно с помощью

stream.WriteAsync(byteArray.AsBuffer()); 

вы должны использовать растровый кодер, окончательный рабочий код:

InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream(); 
     var buffer = await rendered.GetPixelsAsync(); 
     // await stream.ReadAsync(buffer, (uint)buffer.Length, InputStreamOptions.None); 
     BitmapImage img = new BitmapImage(); 
     var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream); 
     encoder.SetPixelData(
      BitmapPixelFormat.Bgra8, 
      BitmapAlphaMode.Straight, 
      (uint)rendered.PixelWidth, 
      (uint)rendered.PixelHeight, 
      DisplayInformation.GetForCurrentView().LogicalDpi, 
      DisplayInformation.GetForCurrentView().LogicalDpi, 
      buffer.ToArray()); 
     await encoder.FlushAsync(); 
     await img.SetSourceAsync(stream); 
     preview.Source = img;