UWP получает байты или пиксели из BitmapImage

#c# #uwp #async-await #bitmap #bitmapimage

#c# #uwp #асинхронный -ожидание #растровое изображение #растровое изображение

Вопрос:

Мне нужно выполнить параллельную работу (конечно, асинхронную задачу), чтобы размыть изображения, выбранные из папки, поэтому я нашел это (BitmapImage), но проблема в том, что я не знаю, как получить доступ к байтам или пикселям этого объекта, чтобы я мог их изменить, размыть или что-то еще:

 var folderPicker = new Windows.Storage.Pickers.FolderPicker();
            folderPicker.FileTypeFilter.Add(".jpg");
            folderPicker.FileTypeFilter.Add(".jpeg");
            folderPicker.FileTypeFilter.Add(".png");

            var folder = await folderPicker.PickSingleFolderAsync();
            var filesList = await folder.GetFilesAsync();



            for (int i = 0; i < filesList.Count; i  )
            {
                using (var stream = await filesList[i].OpenAsync(Windows.Storage.FileAccessMode.Read))
                {
//Here I will use some array of BitmapImage 
                    var bitmapImage = new Windows.UI.Xaml.Media.Imaging.BitmapImage();
                    await bitmapImage.SetSourceAsync(stream);

                    //show Image on Form
                    imageSourceForm.Source = bitmapImage;
                }

            }


 

Итак, есть ли какой-либо способ получить пиксели или байты этого объекта, или, может быть, вы знаете, что использовать, чтобы я мог работать, но с асинхронной задачей. Наиболее важной частью является то, что поток пользовательского интерфейса должен быть отзывчивым, в то время как изображения размыты. Заранее спасибо.

Ответ №1:

Для получения байтов изображения можно использовать следующий код:

 var random = await Windows.Storage.Streams.RandomAccessStreamReference.CreateFromFile(filesList[i]).OpenReadAsync();
Windows.Graphics.Imaging.BitmapDecoder decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(random);
Windows.Graphics.Imaging.PixelDataProvider pixelData = await decoder.GetPixelDataAsync();

//Access pixel buffer in such a way
byte[] bytes = pixelData.DetachPixelData();