调用dll传图片数据(多张)
[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);
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;
}
extern "C" __declspec(dllexport) int ProcessImages(IN unsigned char** imageData, int* width, int* height, int* channel, int* stride, int num);
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;
}