调用dll传图片数据(多张)

本文详细描述了如何使用C#通过DllImport调用C++DLL处理多张图片数据,涉及将Bitmap对象转换为OpenCVMat对象并传递给DLL函数的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调用dll传图片数据(多张)

//c#
[DllImport("Dll1.dll")]
public static extern int ProcessImages([In] IntPtr[] imageData, [In] int[] width, [In] int[] height, [In] int[] channel, [In] int[] stride, [In] int num);


//以两张图片示例
int nums = 2;
Bitmap image1 = new Bitmap("D:\\1.jpg");
Bitmap image2 = new Bitmap("D:\\2.jpg");
List<Bitmap> bitmaps = new List<Bitmap>();
bitmaps.Add(image1);
bitmaps.Add(image2);
//构造传入dll的参数
IntPtr[] imageDataIntPtrArray = new IntPtr[nums];
int[] widths = new int[nums];
int[] heights = new int[nums];
int[] channels = new int[nums];
int[] strides = new int[nums];
for (int i = 0; i < nums; i++)
{
    Bitmap image = bitmaps[i];
    Rectangle rect = new Rectangle(0, 0, image.Width, image.Height);
    BitmapData bmpData = image.LockBits(rect, ImageLockMode.ReadWrite, image.PixelFormat);
    int bytes = Math.Abs(bmpData.Stride) * image.Height;
    byte[] imageData = new byte[bytes];
    Marshal.Copy(bmpData.Scan0, imageData, 0, bytes);
    int stride = bmpData.Stride;
    int channel = Bitmap.GetPixelFormatSize(image.PixelFormat) / 8;
    image.UnlockBits(bmpData);
    
    imageDataIntPtrArray[i] = MarshalUnmanagedArray(imageData);
    widths[i] = image.Width;
    heights[i] = image.Height;
    channels[i] = channel;
    strides[i] = stride;

}
int ret = ProcessImages(imageDataIntPtrArray, widths, heights, channels, strides, nums);


public static IntPtr MarshalUnmanagedArray(byte[] array)
{
    GCHandle pinnedArray = GCHandle.Alloc(array, GCHandleType.Pinned);
    IntPtr pointer = pinnedArray.AddrOfPinnedObject();
    pinnedArray.Free();
    return pointer;
}
//.h
extern "C" __declspec(dllexport) int ProcessImages(IN unsigned char** imageData, int* width, int* height, int* channel, int* stride, int num);

//.cpp
int ProcessImages(IN unsigned char** imageData, int* width, int* height, int* channel, int* stride, int num)
{
	vector<Mat> mats;
	for (int i = 0; i < num; i++) {
		cv::Mat image;
		if (channel[i] == 3) {
			image = cv::Mat(height[i], width[i], CV_8UC3, imageData[i], stride[i]).clone();
		}
		else {
			image = cv::Mat(height[i], width[i], CV_8UC1, imageData[i], stride[i]).clone();
		}
		mats.push_back(image);
	}


	cout << "111" << endl;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛奶奥利奥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值