我目前正在使用C#通过使用Lockbits方法从Bitmap获取Pixel信息,如下所示:
BitmapData bmpData = bmpFromScreen2.LockBits(
new Rectangle(0, 0, startDimensions.X, startDimensions.Y),
ImageLockMode.ReadWrite,
bmpFromScreen2.PixelFormat);
到目前为止,我将bmpData复制到一个字节数组,如下所示:
IntPtr ptr = bmpData.Scan0;
int bytes = Math.Abs(bmpData.Stride) * bmpFromScreen2.Height;
byte[] rgbValues = new byte[bytes];
Marshal.Copy(ptr, rgbValues, 0, bytes);
我知道我会以这种方式获得字节:蓝绿红蓝绿红......等等。
现在我的问题出现了:我需要使用位图坐标来获取特定像素的RGB数据。
例如:
假设我从9像素获得rgbValues,如下所示:
255, 255, 0, 120, 222, 230, 15, 255, 0, 130, 255, 140, 50, 20, 20, 25, 115, 210, 170, 0, 0, 45, 50, 100, 90, 75, 120.
让(也)假设这9个像素是3x3的顺序,我们可以像在#34;扫描"中那样组织它们:
第一次扫描:
255, 255, 0, 120, 222, 230, 15, 255, 0
第二次扫描:
130, 255, 140, 50, 20, 20, 25, 115, 210
第三次扫描:
170, 0, 0, 45, 50, 100, 90, 75, 120
如何获得Point(2,3)的蓝色字节索引?
P.S这是我在这里的第一个问题,我事先为我可能犯过的任何错误道歉,我会学习!
答案 0 :(得分:0)
如果你不太关心表演:
Color pixelColor = bmpFromScreen2.GetPixel(x,y);
答案 1 :(得分:0)
好的,我找到了问题的答案,以及帮助我从2D阵列转换为1D的答案。
但是,因为我需要使用3的偏移量(因为数据为每个像素存储了3个值,并且还考虑到我需要从第一个通道的引用中获取另外两个通道,我想出了这个方法:
public static byte GetIndexValue(byte[] array, Point point, int width, int channel)
{
int indexLoc = point.X + 3 + channel + point.Y * width;
byte indexValue = array[indexLoc];
return indexValue;
}
其中: 数组显然是存储BitmapData的字节数组。 点是2D X,Y点 宽度是数组的宽度(我从通过采用BitmapData Stride计算数组大小时得到了这个) 频道的值为0表示红色,1表示绿色,2表示蓝色