UWP中如何从MediaPlayer获取SoftwareBitmap用于OCR识别
从CanvasBitmap转换到SoftwareBitmap的实现方案
我刚好做过类似的需求,要把MediaPlayer获取到的CanvasBitmap转成SoftwareBitmap用于OCR,其实可以通过读取CanvasBitmap的像素数据再构建SoftwareBitmap来实现,具体步骤和代码如下:
核心思路
CanvasBitmap本身没有直接转成SoftwareBitmap的API,但我们可以获取它的原始像素字节,再根据这些字节和图像参数(宽、高、像素格式)来创建对应的SoftwareBitmap。
具体实现步骤
- 首先从MediaPlayer获取到
CanvasBitmap实例(你已经通过CopyFrameToVideoSurface完成这一步) - 获取CanvasBitmap的像素数据、宽度、高度和像素格式
- 根据这些参数初始化
SoftwareBitmap,并将像素数据写入其缓冲区
代码示例(C#)
using Windows.Graphics.Imaging; using Microsoft.Graphics.Canvas; public async Task<SoftwareBitmap> ConvertCanvasBitmapToSoftwareBitmap(CanvasBitmap canvasBitmap) { // 1. 获取CanvasBitmap的像素字节数据 byte[] pixelBytes = canvasBitmap.GetPixelBytes(); // 2. 确定对应的SoftwareBitmap像素格式(CanvasBitmap常用Bgra8UIntNormalized) BitmapPixelFormat softwareBitmapFormat = BitmapPixelFormat.Bgra8; if (canvasBitmap.Format == CanvasBitmapFormat.Rgba8UIntNormalized) { softwareBitmapFormat = BitmapPixelFormat.Rgba8; } // 可以根据实际需求扩展更多格式匹配 // 3. 创建SoftwareBitmap SoftwareBitmap softwareBitmap = new SoftwareBitmap( softwareBitmapFormat, canvasBitmap.SizeInPixels.Width, canvasBitmap.SizeInPixels.Height); // 4. 将像素数据写入SoftwareBitmap的缓冲区 using (BitmapBuffer buffer = softwareBitmap.LockBuffer(BitmapBufferAccessMode.Write)) using (var reference = buffer.CreateReference()) { // 获取缓冲区的字节数组 byte[] bufferBytes; ((IMemoryBufferByteAccess)reference).GetBuffer(out bufferBytes, out _); // 将CanvasBitmap的像素数据复制到缓冲区 pixelBytes.CopyTo(bufferBytes, 0); } return softwareBitmap; }
注意事项
- 确保CanvasBitmap的像素格式和SoftwareBitmap的格式匹配,否则OCR可能无法正常工作或者出现图像失真
- 如果你的MediaPlayer帧格式不是Bgra8/Rgba8,可以根据实际情况添加更多格式映射
- 处理完SoftwareBitmap后记得及时释放资源,避免内存泄漏,尤其是在每秒处理一次的场景下
内容的提问来源于stack exchange,提问作者Rachel
相关产品推荐
相关产品推荐

