如何在 C# 中处理 ImgData

本文关键字:处理 ImgData | 更新日期: 2023-09-27 17:56:04

我正在尝试按照此处发布的过滤器实现一个 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# 中实现它的最佳方法是什么?

如何在 C# 中处理 ImgData

C# 中没有无符号字符

字节。C/C++ 中的 char 是 C# 中的字节,C# 中有字节;)

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

几乎不。ImageData是某种类型的位图,他通过数组语法做简单的位图。这在 C# 中也是可行的 - 获取位图或他使用的任何临时形式并将其放入字节数组中。现在不明白他做了什么,这是一个失败的事业。我也不确定我是否将其炸成 DirectX 表面并为此编写过滤器;

好的,

我解决了。这:

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);  

元帅是答案:)