C++opencv图片(mat)传入C#bitmap图片

C++将OpenCV的图片传入主要是将图片信息放入uchar数组中,C#再使用byte数组读取信息,生成图片。

RGB图片传入方法:

C++部分程序

cpp 复制代码
extern "C" __declspec(dllexport) void MatToHobject(int& width, int& height, uchar * array)
{
    Mat matTemp;
 
    //依次将rgb数据放入uchar数组中	
    for (int i = 0; i < matTemp.rows; i++) {
	    for (int j = 0; j < matTemp.cols; j++) {
		    for (int k = 0; k < 3; k++) {
			array[i * matTemp.cols * 3 + j * 3 + k] = matTemp.at<cv::Vec3b>(i, j)[k];
		    }
	    }
    }
 
    //将图片的宽高传出
    width = matTemp.cols;
    height = matTemp.rows;
    
}

C#部分程序

cs 复制代码
//C#调用C++程序
[DllImport("Dll1.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void MatToHobject(ref int width, ref int height, ref byte array);
 
cs 复制代码
public Bitmap BitmapGenerateMask(int width, int height, byte[] maskArray)
{
    try
    {
        //生成maks图片
        Bitmap maskBmp = null;
        // 创建Bitmap对象
        using (Bitmap bitmap = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb))
        {
            Rectangle rect = new Rectangle(0, 0, width, height);
            // 锁定Bitmap区域以便进行写入
            BitmapData bmpData = bitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.WriteOnly, bitmap.PixelFormat);
            int stride = bmpData.Stride; // 获取stride值

            // 遍历每一行并根据stride调整
            for (int y = 0; y < height; y++)
            {
                // 计算源和目标的起始位置
                IntPtr destPtr = (IntPtr)((long)bmpData.Scan0 + y * stride);
                int sourceIndex = y * width * 3; // 对于24bppRgb格式,每像素3字节

                // 将当前行的数据复制到bitmap
                Marshal.Copy(maskArray, sourceIndex, destPtr, width * 3); // 每行的字节数
            }

            //复制数据到新的Bitmap
            maskBmp = bitmap.Clone(new System.Drawing.RectangleF(new PointF(0, 0), new SizeF(bitmap.Width, bitmap.Height)), bitmap.PixelFormat);
            // 解锁Bitmap区域
            bitmap.UnlockBits(bmpData);
        }

        return maskBmp;
    }
    catch (Exception ex)
    {
        UIMessageBox.ShowError("绘制maks图异常" + ex.ToString());
        return null;
    }
}
相关推荐
时间的拾荒人1 小时前
Redis 入门详解:核心特性、重要文件与全局命令实战
开发语言·redis·面试
敲上瘾1 小时前
Qt Widgets入门:项目模板解析与Hello World
开发语言·数据库·c++·qt·ui·qt6.3
码途行者2 小时前
网站的SQL 注入:从攻击原理到防御措施
开发语言·sql·php
旖旎夜光3 小时前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
你看我名字3 小时前
产品参数昨天还对,今天已过期:数眼智能与大模型应用如何做资料版本校验
开发语言·架构
老秦包你会4 小时前
计算机网络第二课 ----Socket(套接字)编程预备
开发语言·计算机网络·php
旖旎夜光4 小时前
【C++ 基础入门】C++多态(下):单/多继承虚表、多态补充与 21 道高频题
开发语言·c++·笔记·学习
Wang's Blog13 小时前
Java 项目实战: 交友项目 - FastDFS:入门案例
java·开发语言·交友
apcipot_rain14 小时前
C++转Java日记(03)
java·开发语言·c++
布莱克60514 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map