如何在C#中处理ImgData?

时间:2014-04-01 17:09:38

标签: c# gaussian convolution iplimage

我正在尝试在发布here之后实施retinex过滤器。一开始他定义:

#define pc(image, x, y, c) image->imageData[(image->widthStep * y) + (image->nChannels * x) + c]

当进行高斯卷积时,他将其用作:

v1 += kernel[k] * (unsigned char)pc(temp, i, source, 0);

以后:

pc(img, i, j, 0) = (char)int2smallint(v1); 

我无法将其转换为C#,我也不理解他正在做什么。 C#中没有未签名的字符,他访问图像数据的方式也完全不同。那么,在C#中实现它的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

  

C#中没有未签名的字符

字节。 C / C ++中的Char是C#中的一个字节,C#中有字节;)

  

他访问图像数据的方式也完全不同。

几乎没有。 ImageData是某种类型的位图,他通过数组语法执行简单的位图操作。这在C#中也是可行的 - 抓取位图或他使用的任何临时形式并将其放入字节数组中。现在不明白他做了什么,这是一个失败的原因。我也不确定我是否会把它搞砸到DirectX表面并为此编写过滤器;)

答案 1 :(得分:0)

好吧我解决了。这样:

v1 += kernel[k] * (unsigned char)pc(temp, i, source, 0);

被翻译为:

IntPtr ptr = img.ImageData;
v1 += kernel[k] * Marshal.ReadByte(ptr, (i * img.WidthStep) + (source * img.NChannels) + 0);  

元帅是答案:)