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