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;
}
}