c#和c++的dll之间传递图像数据

''' [DllImport(@"cvdll.dll", EntryPoint = "readimg")]

        extern static void readimg([MarshalAs(UnmanagedType.LPArray)] byte[] bt, int cols, int rows,int size);

'''


''' int cols, rows;

            Bitmap bmp = new Bitmap("D:\\C++代码\\数字图像处理\\lena.bmp");

            cols = bmp.Height;rows = bmp.Width;

            MemoryStream Ms = new MemoryStream();

            bmp.Save(Ms, System.Drawing.Imaging.ImageFormat.Bmp);

            byte[] bt = new byte[Ms.Length];

            MessageBox.Show(Ms.Length.ToString());

            Ms.Position = 0;


            Ms.Read(bt, 0, Convert.ToInt32(Ms.Length));

            int Size = Convert.ToInt32(Ms.Length);

            Ms.Close();


            readimg(  bt,  cols,  rows,Size);

'''

将bmp转化为Memorystream,再转化为byte[],然后传递给c++进行处理.

c++的unsigned char*对应C#的UnmanagedType.LPArray)] byte[] 。


'''

extern "C" __declspec(dllexport) void _stdcall show(char* name);

extern "C" __declspec(dllexport) void _stdcall readimg(uchar * data, int cols, int rows, int size);

using namespace cv;

void _stdcall show(char* name) {

Mat img = imread(name);

if (img.empty()) {

printf("can not open");

}

else{

imshow("test",img);

waitKey(0);

}

}

void _stdcall readimg(uchar* data, int cols,int rows,int size){

FILE* f = fopen("2.bmp", "wb");

fwrite(data, 1, size,f);

fclose(f);

Mat img = imread("2.bmp");

Mat img2=img.clone();

imwrite("12.bmp", img2);

MessageBoxA(0, "4", 0, 0);

imshow(" ", img);

MessageBoxA(0, "5", 0, 0);

}

'''

Messagebox是我用来调试的..

imdecode函数可以将内存中的图像转换为Mat,但是查了资料显示他内部实现也用了fopen,我干脆就用fopen了。



另外一种方案是传递图像的像素数组,

C#中使用lockbit,然后将指向图像数据的指针bmpdata.scano传递给c++,使用memcpy函数把数据复制到opencv 的Mat.data中

c#图像是四字节对齐的,而opencv的Mat不是。(假如图像宽511,c#中图像数据每行有512个,直接传递给c++会出问题)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容