You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何将SoftwareBitmap转换为Mat?

C#中SoftwareBitmap转OpenCV Mat的方案

方法一:直接操作像素缓冲区(高效推荐)

通过直接访问SoftwareBitmap的像素缓冲区,创建对应的OpenCV Mat对象,这是效率最高的方式:

using OpenCvSharp;
using Windows.Graphics.Imaging;
using System.Runtime.InteropServices;

public Mat SoftwareBitmapToMat(SoftwareBitmap softwareBitmap)
{
    // 统一转换为BGRA8格式(OpenCV默认兼容该格式)
    if (softwareBitmap.BitmapPixelFormat != BitmapPixelFormat.Bgra8)
    {
        softwareBitmap = SoftwareBitmap.Convert(softwareBitmap, BitmapPixelFormat.Bgra8);
    }

    // 锁定缓冲区以访问像素数据
    using (var buffer = softwareBitmap.LockBuffer(BitmapBufferAccessMode.Read))
    using (var reference = buffer.CreateReference())
    {
        // 获取像素数据的指针和总长度
        ((IMemoryBufferByteAccess)reference).GetBuffer(out byte* dataPtr, out uint dataLength);
        
        // 创建Mat:参数依次为高、宽、像素类型、数据指针、每行字节数
        var tempMat = new Mat(
            softwareBitmap.PixelHeight, 
            softwareBitmap.PixelWidth, 
            MatType.CV_8UC4, 
            (IntPtr)dataPtr, 
            softwareBitmap.PixelWidth * 4
        );
        
        // 克隆Mat避免缓冲区释放后数据失效
        return tempMat.Clone();
    }
}

// 用于访问MemoryBuffer的COM接口
[ComImport]
[Guid("5B0D3235-4DBA-4D44-865E-8F1D0E4FD04D")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IMemoryBufferByteAccess
{
    void GetBuffer(out byte* buffer, out uint capacity);
}

方法二:通过WriteableBitmap中转(简单但效率稍低)

借助WriteableBitmap作为中间载体,利用OpenCvSharp内置的转换器完成转换:

using OpenCvSharp;
using Windows.Graphics.Imaging;
using Windows.UI.Xaml.Media.Imaging;

public Mat SoftwareBitmapToMatViaWriteableBitmap(SoftwareBitmap softwareBitmap)
{
    // 初始化WriteableBitmap并复制像素数据
    var writeableBitmap = new WriteableBitmap(softwareBitmap.PixelWidth, softwareBitmap.PixelHeight);
    softwareBitmap.CopyToBuffer(writeableBitmap.PixelBuffer);
    
    // 使用OpenCvSharp的转换器直接转Mat
    return BitmapConverter.ToMat(writeableBitmap);
}

关键注意事项

  • 必须安装OpenCvSharp相关NuGet包:OpenCvSharp4(核心库)和OpenCvSharp4.runtime.win(Windows平台运行时)
  • 若原SoftwareBitmap是灰度图,需转换为BitmapPixelFormat.Gray8,同时将Mat类型设为MatType.CV_8UC1
  • 直接操作缓冲区时必须克隆Mat,因为临时Mat直接指向SoftwareBitmap的缓冲区,缓冲区解锁后原Mat会变成无效数据
  • 如果需要将Mat转回SoftwareBitmap,可反向操作:从Mat提取像素数据后写入SoftwareBitmap的缓冲区

内容的提问来源于stack exchange,提问作者Dmitrii Polianskii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 01:25:20