Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 试图理解这个图像函数_C#_Arrays_Unsafe - Fatal编程技术网

C# 试图理解这个图像函数

C# 试图理解这个图像函数,c#,arrays,unsafe,C#,Arrays,Unsafe,任何想法该函数应将图像转换为灰度图像,并将颜色值存储到灰度数组中。但是这个函数中有一个错误(实际上是2) 首先,您只读取图像的左上角像素,而应使用以下方法: var imageData = new byte[Width, Height][]; imageData[x,y] = pixelSet //basically byte[]; 另一件事是,当你变换你的图像时,所有的颜色都不是“相等的”,你可以在谷歌上找到应用于红、绿、蓝通道的常用因子,很容易变换成灰度 为了回答您的问题,函数中为数组赋值

任何想法

该函数应将图像转换为灰度图像,并将颜色值存储到
灰度
数组中。但是这个函数中有一个错误(实际上是2)

首先,您只读取图像的左上角像素,而应使用以下方法:

var imageData = new byte[Width, Height][];
imageData[x,y] = pixelSet //basically byte[];
另一件事是,当你变换你的图像时,所有的颜色都不是“相等的”,你可以在谷歌上找到应用于红、绿、蓝通道的常用因子,很容易变换成灰度

为了回答您的问题,函数中为数组赋值的方式是正确的

编辑

要回答您的评论:

在括号
[]
中,我计算阵列中的偏移量,其中坐标
(j,I)
处像素的颜色信息为。(顺便说一句,我们通常使用
i
表示
x
j
表示
y
,这里正好相反)

假设您想知道坐标
x=2,y=4
处像素的颜色值,则需要使用以下公式:

color=y*+x

因为你的图像是32位的,用上面的公式你会得到颜色的红色值。 如果你想要绿色的,你加1,蓝色的加2

在我发布的这段代码中,我假设每行的长度正好为
width*4
字节,对于32位图像,这在大多数情况下是正确的,但并不总是正确的,因此最好实际使用这个公式:


[imagePointer[i*bitmapData1.Stride+j]

我认为您正在尝试这样做。显然,我还没有测试过此代码,但它会让您朝着想要的方向前进

GreyImage[j, i] = (int)((imagePointer1[j * 4 + i * bitmapData1.Width * 4] + imagePointer1[j * 4 + i * bitmapData1.Width * 4 + 1] + imagePointer1[j * 4 + i * bitmapData1.Width * 4 + 2]) / 3.0);

指向数组的指针始终指向元素零。您可以通过向指针添加或递增指针来访问其他元素

byte[] save = new byte[4];
save[0] = bitmapData1.Scan0[0];
save[1] = *(imagePointer1 + 1);
save[2] = *(imagePointer1 + 2);
save[3] = *(imagePointer1 + 3);
加号和减号按构成数组数据类型大小的字节数移动指针引用。如果是int[],则+和-将以4字节的增量移动指针


我希望这对您有所帮助。

我不想存储灰度,我想将组成图像的4个字节保留在一个新的数组中,就像我在回答底部所说的那样,非常感谢您澄清这些问题appreciated@No1_Melman您可以使用同一段代码,只需删除行末尾的
/3.0
,非常感谢,你能不能再解释一下你在imagePointer1的
[]
中做了些什么,只是对使用的数字或变量的解释。谢谢。是的,这正是我要找的,我在谷歌的旅行中发现了类似的东西,然而,当谈到选择
字节[]
数组大小,我不知道,所以我想“如何从
imagePointer
”中获得它,所以我想我理解imagePointer是整个图像的指针。是的,imagePointer1是指向bitmapData1.Scan0[0]的指针。如果试图读取bitmapData1.Scan0.Length,则会出现问题。
byte[] save = new byte[4];
Array.Copy(*imagePointer1, save, 4);
byte[] save = new byte[4];
save[0] = bitmapData1.Scan0[0];
save[1] = *(imagePointer1 + 1);
save[2] = *(imagePointer1 + 2);
save[3] = *(imagePointer1 + 3);
 (imagePointer1 + 5)  // pointer to 5th element
*(imagePointer1 + 5)  // value of 5th element
  imagePointer1 += 5; // imagePointer1 now starts at element 5