halcon c# 内存泄漏 图片存储格式转换

Posted lonelyrains

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了halcon c# 内存泄漏 图片存储格式转换相关的知识,希望对你有一定的参考价值。

byte[]类型先专成IntPtr类型,然后转为HObject类型。转换代码:

IntPtr p = Marshal.AllocHGlobal(144);
Marshal.Copy(bytearray, 0, p, 144)
HOperaterSet.GenImage1Extern(out hobj, "byte", 12, 12, p, 0);

上面这段代码会申请一段内存,但是后续用完hobj之后,即使Dispose尝试释放内存也会失败(halcon在这里不会抛异常),因为这段内存不是直接在halcon中申请的,还有一个指针p在引用。从而导致内存溢出。

 

解决方法1:

在hobj.Dispose之前先使用GetImagePointer1获取hobj的图像指针,然后调用FreeHGlobal释放这个指针,然后才Dispose。

这个方法的弊端是,在外面Dispose的代码,要调用多余的获取指针的代码,代码不够优美。

 

解决方法2:

GenImage1Extern的最后一个参数是clearproc内存管理回调,利用这个回调来处理内存释放。halcon调用Dispose时会自动调用这个回调,并且自动填入调用参数。

HOperatorSet.GenImage1Extern(out hobj, "byte", 12, 12, p, Marshal.GetFunctionPointerForDelegate(callback));

HalconDotNet.HalconAPI.HClearProcCallBack callback = __OnFreeCallBack;
private static void __OnFreeCallBack(IntPtr pImg)

    Marshal.FreeHGlobal(pImg);

参考代码路径:C:\\Users\\Public\\Documents\\MVTec\\HALCON-xx.xx-Progress\\examples\\c#\\IACallback

以上是关于halcon c# 内存泄漏 图片存储格式转换的主要内容,如果未能解决你的问题,请参考以下文章

解决Halcon转C#时,图像显示的问题

js object类型转换 内存泄漏 垃圾回收机制

halcon与C#混合编程进阶版

HALCON 怎么处理 C# 已经读取好的图片?

内存溢出和内存泄漏

怎么利用c#在导入halcon打开摄像头