Как преобразовать UWP SoftwareBitmap в WPF Bitmap? - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь заставить SoftwareBitmap быть пригодным для использования в WPF как Bitmap. Подходы, подобные , показывают, что выглядит многообещающе, но они, похоже, используют объекты из разных пространств имен, которые не совсем работают в моем случае. Для контекста я использую MediaCapture из земли UWP для потоковой передачи с веб-камеры в моем приложении WPF.

public static WriteableBitmap WriteableBitmapFromSoftwareBitmap(SoftwareBitmap soft)
{
    WriteableBitmap writeable = new 
    WriteableBitmap(soft.PixelWidth, soft.PixelHeight);
    soft.CopyToBuffer(writeable.PixelBuffer);

    return writeable;
}

public static Bitmap BitmapFromWriteableBitmap(WriteableBitmap writeBmp)
{
    Bitmap bmp;
    using (MemoryStream outStream = new MemoryStream())
    {
        System.Windows.Media.Imaging.BitmapEncoder enc = new 
            BmpBitmapEncoder();

        enc.Frames.Add(BitmapFrame.Create(writeBmp)); // Error here
        enc.Save(outStream);
        bmp = new Bitmap(outStream);
    }

    return bmp;
}

К сожалению, в BitmapFromWriteableBitmap вызов BitmapFrame.Create жалуется на то, что он не может создать URI из такого вида WriteableBitmap.

Обратите внимание, что WriteableBitmap является Windows.UI.Xaml.Media.Imaging.WriteableBitmap, SoftwareBitmap является Windows.Graphics.Imaging.SoftwareBitmap, и желаемый Bitmap является System.Drawing.Bitmap.

1 Ответ

0 голосов
/ 29 июня 2018

Прямого преобразования нет. Вам нужно будет извлечь данные изображения из SoftwareBitmap, а затем создать новое растровое изображение из этих данных.

По сути, это связанный вопрос : он кодирует данные из WriteableBitmap в поток .BMP, а затем загружает System.Drawing.Bitmap из этого потока.

Вы можете сделать то же самое из SoftwareBitmap, используя Windows.Graphics.Imaging.BitmapEncoder . SetSoftwareBitmap , чтобы преобразовать его содержимое в поток изображений и затем создать новый System.Drawing. .Bitmap из этого потока.

См. Сохранение SoftwareBitmap в файл с BitmapEncoder для примера кода. Вы можете выполнить рендеринг в InMemoryRandomAccessStream вместо потока StorageFile, чтобы избежать сохранения на диск, и можете использовать AsStream для преобразования его в .Net System.IO.Stream для чтения в систему. .Drawing.Bitmap что-то вроде следующего (непроверенного) фрагмента:

using (var stream = new Windows.Storage.Streams.InMemoryRandomAccessStream())
{
    BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
    encoder.SetSoftwareBitmap(softwareBitmap);
    await encoder.FlushAsync();
    bmp = new System.Drawing.Bitmap(stream.AsStream);
}
...