2016-06-09 3 views
2

У меня есть приложение для обработки окон Windows 10. Я применяю фильтры на этом изображении и показывая его на элементе изображения. Вот как я применяю фильтр и устанавливаю его как источник для элемента MainImage.Как передать отфильтрованное изображение в UWP C#

ProcessImage processImage = new ProcessImage(sourcePixels, width, height); 

     byte[] blurEffect = processImage.BlurEffect(width, height); 

     WriteableBitmap blurImage = new WriteableBitmap((int)width, (int)height); 
     using (Stream stream = blurImage.PixelBuffer.AsStream()) 
     { 
      await stream.WriteAsync(blurEffect, 0, blurEffect.Length); 
      MainImage.Source = blurImage; 
     } 

До сих пор я установил образ WriteableBitmap для источника. Теперь я хочу поделиться этим изображением с использованием данных DataTransferManager запросили событие, как показано

dataTransferManager = DataTransferManager.GetForCurrentView(); 
     dataTransferManager.DataRequested += DataTransferManager_DataRequested; 

Тела его события, содержащего этот код

DataPackage dataPackage = args.Request.Data; 
     dataPackage.Properties.Title = "App Name"; 
     dataPackage.Properties.Description = "My description"; 

     dataPackage.SetBitmap(); 

На мероприятии доли нажатия кнопки, я звоню showshareUI как это

DataTransferManager.ShowShareUI(); 

Я пытаюсь разделить изображение, используя четвертую строку выше, что является SetBitmap метод, но проблема здесь этот метод хочет Random AccessStreamReference значение, и у меня есть отфильтрованное изображение типа writeablebitmap. Как я могу это сделать?

ответ

1

Вы можете написать WriteableBitmap к InMemoryRandomAccessStream

у меня нет доступа к моей машине Dev, так что я не могу проверить это, но вот быстрый пример:

private async Task<IRandomAccessStream> Convert(WriteableBitmap writeableBitmap) 
    { 
     var stream = new InMemoryRandomAccessStream(); 

     BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream); 
     Stream pixelStream = writeableBitmap.PixelBuffer.AsStream(); 
     byte[] pixels = new byte[pixelStream.Length]; 
     await pixelStream.ReadAsync(pixels, 0, pixels.Length); 

     encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)writeableBitmap.PixelWidth, (uint)writeableBitmap.PixelHeight, 96.0, 96.0, pixels); 
     await encoder.FlushAsync(); 

     return stream; 
    } 

С dataPackage.SetBitmap() ожидает RandomAccessStreamReference, вам нужно будет получить его на основе IRandomAccessStream, чтобы возвращаемый выше метод возвращался. К счастью, это довольно просто:

var streamRef = RandomAccessStreamReference.CreateFromStream(stream) 

Надеюсь, что работает.

+0

После получения потока и установки его в dataPackage.SetBitmap (поток); он показывает ошибку «Невозможно преобразовать из System.Threading.Tasks.Task <...> в Window.Storage.Streams.MemoryAccessStreamReferece –

+0

убедитесь, что вы ожидаете метод, когда вы его вызываете. ie stream = wait Convert (...) – AlexDrenea

+0

Я сделал это, теперь, когда я передаю результат в dataPackage.SetBitmap (result), он говорит, что не может преобразовать из IRandomAccessStream в RandomAccessStreamReference. –

Смежные вопросы