我有专有(内部)图像处理库的C#接口。
接口看起来像这样:
void RGBConvert::ConvertFromRGBToYCbCr(
int ncols,
int nrows,
IntPtr rgb,
IntPtr out)
其中IntPtr是指向底层内存的指针。我已经多次从Matlab调用.NET对象,但是将大型C数据数组传递给C#并不是我所做的事情,并且达到了死胡同。
Matlab手册:http://www.mathworks.com/help/matlab/matlab_external/handling-net-data-in-matlab_bte9oxc-1.html#bte9o7y-1表示不支持IntPtr。我的意思是,它不会将Unsigned8Bit整数数组转换为IntPtr以传递给该方法。 (如果你通过其他一些机制构造一个IntPtr,Matlab会像任何其他.NET对象一样处理它并传递它。)那么,我如何找到指向Matlab数据的指针,并将它传递给这个方法?
显然,一种方法是使用普通的Matlab C / C ++接口“欺骗”matlab,揭示指向底层数组数据结构的指针,然后将该指针传递给IntPtr构造函数。然后传递IntPtr。我们原本希望有一个“纯粹的”C#实现,并且除了C#接口之外不必拥有C / C ++接口。
另一种途径可能是采用Matlab ConvertArray
调用,将matlab数组转换为.NET数组,但是我仍需要一个指向原始数据的IntPtr。
我不介意这里的无关内存副本,这不是性能关键代码,这是实验代码。
任何人都有此问题和建议的经验吗?
思想?
答案 0 :(得分:0)
如果你无法获得MathLab数组的地址,你最好用一个接受(并返回)数组的方法包装第三方API
byte[] ConvertFromRGBToYCbCr(int ncols, int nrows, byte[] rgb)
然后使用类似this的技术在.net中获取此数组的地址,以调用原始的RGBConvert方法。