static void Main(string[] args) { // 种子原图 Bitmap bmpobj_dst = (Bitmap)Image.FromFile("D:\\Myself\\Dataset\\seed\\D5.jpg"); // 图片的宽和高 int width = bmpobj_dst.Width; int height = bmpobj_dst.Height; // 转化成位bitmap utils.BitMapInfo bi_dst = utils.bitmapToByteArray(bmpobj_dst, 1); // 建立显示图片 byte[] pfinal_pic = new byte[width * height * 4]; // 建立结构体所需内存大小 int msize = Marshal.SizeOf(typeof(sOneSeedInfoApi)) * 2000; IntPtr SeedDataArr_out = Marshal.AllocHGlobal(msize); // 直接分配2000个元素的空间,保存计数参数 // 模拟struct sOneSeedInfoApi[] pClass = new sOneSeedInfoApi[2000]; // 模拟struct int seedNum = 2; // 调用dll获取处理后的图片 /* * seedNum : 统计种子数 * bi_src.Result: 二值图图片信息 * bi_src.width : 二值图图片的宽 * bi_src.height: 二值图图片的高 * * bi_dst.Result: 原图片信息 * bi_dst.width : 原图片的宽 * bi_dst.height: 原图片的高 * * pfinal_pic: 最终的显示图片 * * SeedDataArr_out : 种子的结构体信息 */ int res = callAPI.getImage(seedNum, bi_dst.Result, bmpobj_dst.Width, bmpobj_dst.Height, bi_dst.Step, pfinal_pic, SeedDataArr_out); for (int i = 0; i < 10; i++) { IntPtr pPonitor = new IntPtr(SeedDataArr_out.ToInt64() + Marshal.SizeOf(typeof(sOneSeedInfoApi)) * i); pClass[i] = (sOneSeedInfoApi)Marshal.PtrToStructure(pPonitor, typeof(sOneSeedInfoApi)); Console.WriteLine("barcode:{0}; num:{1}", pClass[i].sLength, pClass[i].sWide); } Marshal.FreeHGlobal(SeedDataArr_out); // 获得图片所需空间,并保存至本地 GCHandle hObject = GCHandle.Alloc(pfinal_pic, GCHandleType.Pinned); IntPtr pBGRAData = hObject.AddrOfPinnedObject(); Bitmap SeedSizeImg = new Bitmap(width, height, width * 4, PixelFormat.Format32bppArgb, pBGRAData); if (hObject.IsAllocated) { hObject.Free(); } SeedSizeImg.Save(".//7.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); // 回收bitmap的内存 bmpobj_dst.Dispose(); bmpobj_dst = null; }
static void Main(string[] args) { // 种子二值图 Bitmap bmpobj_src = (Bitmap)Image.FromFile("D:\\Myself\\Dataset\\Rice\\E4.jpg"); // 种子原图 Bitmap bmpobj_dst = (Bitmap)Image.FromFile("D:\\Myself\\Dataset\\seed\\D4.jpg"); // 图片的宽和高 int width = bmpobj_dst.Width; int height = bmpobj_dst.Height; // 转化成位bitmap utils.BitMapInfo bi_src = utils.bitmapToByteArray(bmpobj_src, 0); utils.BitMapInfo bi_dst = utils.bitmapToByteArray(bmpobj_dst, 1); // 建立显示图片 byte[] pfinal_pic = new byte[width * height * 4]; // 建立结构体所需内存大小 int msize = Marshal.SizeOf(typeof(sOneSeedInfoApi)) * 2000; IntPtr SeedDataArr_out = Marshal.AllocHGlobal(msize); // 直接分配2000个元素的空间,保存计数参数 // 模拟struct int simu = callAPI.simuStr(SeedDataArr_out); // 调用dll获取处理后的图片 /* * bi_src.Result: 二值图图片信息 * bi_src.width : 二值图图片的宽 * bi_src.height: 二值图图片的高 * * bi_dst.Result: 原图片信息 * bi_dst.width : 原图片的宽 * bi_dst.height: 原图片的高 * * pfinal_pic: 最终的显示图片 * * SeedDataArr_out : 种子的结构体信息 */ int res = callAPI.getImage(bi_src.Result, bmpobj_src.Width, bmpobj_src.Height, bi_src.Step, bi_dst.Result, bmpobj_dst.Width, bmpobj_dst.Height, bi_dst.Step, pfinal_pic, SeedDataArr_out); // 获得图片所需空间,并保存至本地 GCHandle hObject = GCHandle.Alloc(pfinal_pic, GCHandleType.Pinned); IntPtr pBGRAData = hObject.AddrOfPinnedObject(); Bitmap SeedSizeImg = new Bitmap(width, height, width * 4, PixelFormat.Format32bppArgb, pBGRAData); if (hObject.IsAllocated) { hObject.Free(); } SeedSizeImg.Save("D:\\Myself\\Dataset\\7.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); bmpobj_src.Dispose(); // 回收bitmap的内存 bmpobj_dst.Dispose(); bmpobj_src = null; bmpobj_dst = null; }