初始化 CanvasBitmap UWP

Initializing CanvasBitmap UWP

我正在尝试将 SoftwareBitmap 转换为 CanvasBitmap(在 UWP 上)。 但是当我使用 BitmapPixelFormat.Bgra8 && BitmapAlphaMode.Premultiplied 时,我得到了 unsupported pixel format or alpha mode.

这样的错误

我决定使用以下代码尝试所有可能的格式:

if (softwareBitmap != null)
{
    var wasSuccess = false;
    foreach (var bitmapAlphaMode in new[] {BitmapAlphaMode.Straight, BitmapAlphaMode.Premultiplied, 
                                           BitmapAlphaMode.Ignore})
    {
        foreach (var bitmapPixelFormat in new[] { 
            BitmapPixelFormat.Bgra8, BitmapPixelFormat.Gray8, BitmapPixelFormat.Gray16, 
            BitmapPixelFormat.Yuy2, BitmapPixelFormat.Rgba8, BitmapPixelFormat.Rgba16, 
            BitmapPixelFormat.Nv12, BitmapPixelFormat.P010, BitmapPixelFormat.Unknown
        })
        {
            if (wasSuccess)
            {
                break;
            }
            try
            {
                SoftwareBitmap.Convert(softwareBitmap, bitmapPixelFormat, bitmapAlphaMode);
                var bitmap = CanvasBitmap.CreateFromSoftwareBitmap(
                    _canvasDevice, 
                    softwareBitmap
                );
                wasSuccess = bitmap != null;
            }
            catch (Exception ex)
            {
            }
        }
    }
} 

但在所有可能的尝试之后,wasSuccessfalse。 (_canvasDevice初始化成功,不是问题)

怎么可能?

But after all possible attempt's, wasSuccess is false. (_canvasDevice was initialized successfully, that's not the problem).

并非所有的BitmapPixelFormats都被CanvasBitmap支持,请参考CreateFromSoftwareBitmap文档备注部分,你会发现BitmapPixelFormat.Unknown BitmapPixelFormat.Gray16 BitmapPixelFormat.Nv12 BitmapPixelFormat.Yuy2不是支持。

并不是所有的 AlphaModes 都适用于 CanvasBitmap,请参考这个 document。你会发现 CanvasBitmap 与 Premultiplied, Ignore alpha 模式兼容。仅 A8UIntNormalized A8UIntNormalized 支持 Straight alpha 模式。

顺便说一句,上面代码段中的SoftwareBitmap.Convert方法有错误。您应该像下面那样将 return 值分配给 softwareBitmap,否则它将永远不会更新 softwareBitmap 属性.

softwareBitmap =  SoftwareBitmap.Convert(softwareBitmap, bitmapPixelFormat, bitmapAlphaMode);