Преобразование из PixelBuffer в изображение в UWP C# (с использованием только Windows.UI.Xaml)

Привет всем, я хочу преобразовать пиксельный буфер в изображение и распечатать его. Это информация, которая есть у меня в моей программе: PixelBuffer: ширина int, высота int, буфер IntPtr, шаг. Вот как я не могу это сделать из-за некоторых ошибок сборки:

Windows.UI.Xaml.Controls.Image image = new Windows.UI.Xaml.Controls.Image();
System.Windows.Media.Imaging.BitmapFrame frame = System.Windows.Media.Imaging.BitmapFrame.Create(System.Windows.Media.Imaging.BitmapSource.Create(
                        (int)pr.pixelBuffer.width,
                        (int)pr.pixelBuffer.height,
                        96,
                        96,
                        System.Windows.Media.PixelFormats.Rgb24,
                        null,
                        pr.pixelBuffer.buffer,
                        (int)(pr.pixelBuffer.stride * pr.pixelBuffer.height),
                        (int)pr.pixelBuffer.stride));
Windows.UI.Xaml.Media.Imaging.BitmapImage bitmapImage = new Windows.UI.Xaml.Media.Imaging.BitmapImage(frame.BaseUri);
image.Source = bitmapImage;//frame;
stackPanel.Children.Add(image)

Есть ли способ сделать это без System.Windowxs.Media.Imaging? Используя только Windows.UI.Xaml?

Спасибо!


person user7827649    schedule 05.05.2017    source источник
comment
Вы пытались использовать BitmapEncoder вместо растрового кадра?   -  person Romasz    schedule 05.05.2017
comment
WriteableImage можно установить Pixel.   -  person lindexi    schedule 05.05.2017


Ответы (1)


Я хочу преобразовать пиксельный буфер в изображение и распечатать его.

Я не уверен, откуда взялся ваш пиксельный буфер, поскольку ваш код показывает только получение от pr obejct. В приложении uwp, если вы получили его от Writeable​Bitmap вам может не понадобиться сначала получать пиксельный буфер, просто установите WriteableBitmap как источник изображения. Оба Bitmap​Image и WriteableBitmap может быть источником изображения, а не только BitmapImage.

StorageFile imagefile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/caffe1.jpg"));
WriteableBitmap writeableimage;
using (IRandomAccessStream stream = await imagefile.OpenAsync(FileAccessMode.Read))
{
    SoftwareBitmap softwareBitmap;
    BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
    softwareBitmap = await decoder.GetSoftwareBitmapAsync();
    writeableimage = new WriteableBitmap(softwareBitmap.PixelWidth, softwareBitmap.PixelHeight);
    writeableimage.SetSource(stream);
}
Windows.UI.Xaml.Controls.Image image = new Windows.UI.Xaml.Controls.Image();
image.Source = writeableimage;
stackPanel.Children.Add(image);

Если это не из WriteableBitmap, вам может потребоваться создать WriteableBitmap с известной шириной, высотой и записать в него данные о пикселях.

StorageFile imagefile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/caffe2.jpg"));
int width;
int height;
byte[] Inptrbuffer;
using (IRandomAccessStream stream = await imagefile.OpenAsync(FileAccessMode.Read))
{
    SoftwareBitmap softwareBitmap;
    BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
    softwareBitmap = await decoder.GetSoftwareBitmapAsync();
    width = softwareBitmap.PixelWidth;
    height = softwareBitmap.PixelHeight;
    Windows.Graphics.Imaging.PixelDataProvider pixelData = await decoder.GetPixelDataAsync();
    Inptrbuffer = pixelData.DetachPixelData(); 
}
WriteableBitmap newfrompixel=new WriteableBitmap(width,height);
using (Stream stream = newfrompixel.PixelBuffer.AsStream())
{
    await stream.WriteAsync(Inptrbuffer, 0, Inptrbuffer.Length);
} 
Windows.UI.Xaml.Controls.Image image = new Windows.UI.Xaml.Controls.Image(); 
image.Source = newfrompixel; 
stackPanel.Children.Add(image);

Если вам нужно отредактировать изображение перед его показом, обратитесь к Создавать, редактировать и сохранять растровые изображения.

person Sunteen Wu    schedule 08.05.2017
comment
Спасибо за ответ! На самом деле я редактирую свою фотографию в родном C, а затем взамен получаю информацию, как указано в PixelBuffer в моем приложении C #, поэтому мне нужно преобразовать PixelBuffer в изображение или передавать только из данных PixelBuffer, у меня нет StorageFile или подобных вещей - person user7827649; 08.05.2017
comment
@user7827649 user7827649, как я уже сказал выше, если это не из WriteableBitmap, вам может потребоваться создать WriteableBitmap с известной шириной, высотой и записать в него данные в пикселях. Пожалуйста, проверьте фрагмент кода во второй части. Кстати, если мой ответ помог вам, отметьте его как принятый. - person Sunteen Wu; 08.05.2017
comment
У меня возникла проблема, потому что я удалил альфа-канал из изображения / или это из-за шага изображения, я до сих пор не знаю, но ваше решение правильное, и это то, что я искал. Спасибо !! - person user7827649; 08.05.2017
comment
@ user7827649, откройте новую тему, если у вас все еще есть новые проблемы. Может быть, предоставить несколько скриншотов, чтобы прояснить проблему. Спасибо. - person Sunteen Wu; 09.05.2017