#pragma once
#define DLL_API extern "C" _declspec(dllexport)
DLL_API void GetMat(char* filename, uchar* data, size_t& size)
DLL_API void GetMat(char* filename, uchar* data, size_t& size)
{
std::vector<uchar> buffer;
cv::Mat img = cv::imread(filename);
cv::Mat imggray;
cv::cvtColor(img, imggray, cv::COLOR_RGB2GRAY);
cv::imencode(".bmp", imggray, buffer);
size = buffer.size();
for (uchar& var : buffer)
{
*data = var;
data++;
}
}
public partial class Form1 : Form
{
[DllImport("C++ToCSharpDll.dll")]
public extern static void GetMat(string filename, ref byte data, out ulong size);
private void button2_Click(object sender, EventArgs e)
{
string filename = "4.jpg";//文件路径
byte[] ptrData = new byte[1920 * 1080 * 3]; //尽可能大的byte[],一般大于显示的最大图片内存即可
ulong size = new ulong();
GetMat(filename, ref ptrData[0], out size); //调用dll库中的函数,将C++的内存数据转入C#的内存中
pictureBox1.Image = Image.FromStream(new MemoryStream(ptrData, 0, (int)size));//将byte[]转化为MemoryStream再传递给imag
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
}

DLL_API void IntPtrToMat(unsigned char* data, int height, int width, int stride)
{
cv::Mat img;
if (stride / width == 3) img = cv::Mat(height, width, CV_8UC3, data, 0);
if (stride / width == 1) img = cv::Mat(height, width, CV_8UC1, data, 0);
if (stride / width == 4) img = cv::Mat(height, width, CV_8UC4, data, 0);
cv::imshow("image", img);
cv::waitKey(0);
}
[DllImport("C++ToCSharpDll.dll")]
public extern static void IntPtrToMat(IntPtr byte1, int width, int height, int stride);
private void button3_Click(object sender, EventArgs e)
{
//这里面的内容要及其注意,计算不对的话会造成异常
Bitmap bmp = (Bitmap)Bitmap.FromFile("4.jpg");
BitmapData bmpdata = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
int length = bmp.Width * bmp.Height * (bmpdata.Stride / bmp.Width);
byte[] buffer = new byte[length];
IntPtr ptr = bmpdata.Scan0;
Marshal.Copy(ptr, buffer, 0, length);
IntPtrToMat(ptr, bmp.Height, bmp.Width, bmpdata.Stride);
bmp.UnlockBits(bmpdata);
}
5.运行结果
