如何使用带有C#

时间:2016-08-10 03:58:50

标签: c# arrays bitmap gdi+

我目前正在使用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这是我在这里的第一个问题,我事先为我可能犯过的任何错误道歉,我会学习!

2 个答案:

答案 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表示蓝色

相关问题