#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();