初始化 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)
{
}
}
}
}
但在所有可能的尝试之后,wasSuccess
是 false
。 (_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);
我正在尝试将 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)
{
}
}
}
}
但在所有可能的尝试之后,wasSuccess
是 false
。 (_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);