来自位图数据的c#RGB值

我是新的使用Bitmap并使用每像素16位Format16bppRgb555 ;

我想从位图数据中提取RGB值。 这是我的代码

 static void Main(string[] args) { BitmapRGBValues(); Console.ReadKey(); } static unsafe void BitmapRGBValues() { Bitmap cur = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format16bppRgb555); //Capture Screen var screenBounds = Screen.PrimaryScreen.Bounds; using (var gfxScreenshot = Graphics.FromImage(cur)) { gfxScreenshot.CopyFromScreen(screenBounds.X, screenBounds.Y, 0, 0, screenBounds.Size, CopyPixelOperation.SourceCopy); } var curBitmapData = cur.LockBits(new Rectangle(0, 0, cur.Width, cur.Height), ImageLockMode.ReadWrite, PixelFormat.Format16bppRgb555); try { byte* scan0 = (byte*)curBitmapData.Scan0.ToPointer(); for (int y = 0; y < cur.Height; ++y) { ulong* curRow = (ulong*)(scan0 + curBitmapData.Stride * y); for (int x = 0; x < curBitmapData.Stride / 8; ++x) { ulong pixel = curRow[x]; //How to get RGB Values from pixel; } } } catch { } finally { cur.UnlockBits(curBitmapData); } } 

LockBits实际上可以您的图像转换为所需的像素格式,这意味着不需要进一步转换。 只需将图像锁定为Format32bppArgb ,您就可以从单个字节中获取颜色值。

 BitmapData curBitmapData = cur.LockBits(new Rectangle(0, 0, cur.Width, cur.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); Int32 stride = curBitmapData.Stride; Byte[] data = new Byte[stride * cur.Height]; Marshal.Copy(curBitmapData.Scan0, data, 0, data.Length); cur.UnlockBits(curBitmapData); 

使用此代码,您最终得到字节数组data ,该数据以ARGB格式填充您的图像数据,这意味着颜色组件字节将按照[B,G,R,A]的顺序存在。 请注意, stride是要跳到图像上的下一行的字节数,并且由于这并不总是等于“每个像素的宽度*字节数”,因此应始终考虑它。

现在你知道了,你可以用它做任何你想做的事……

 Int32 curRowOffs = 0; for (Int32 y = 0; y < cur.Height; y++) { // Set offset to start of current row Int32 curOffs = curRowOffs; for (Int32 x = 0; x < cur.Width; x++) { // ARGB = bytes [B,G,R,A] Byte b = data[curOffs]; Byte g = data[curOffs + 1]; Byte r = data[curOffs + 2]; Byte a = data[curOffs + 3]; Color col = Color.FromArgb(a, r, g, b); // Do whatever you want with your colour here // ... // Increase offset to next colour curOffs += 4; } // Increase row offset curRowOffs += stride; } 

您甚至可以编辑字节,然后根据需要从它们构建新图像 。