我正在使用下面的代码从图像中提取 RGB 值,有时这可行,但是在某些文件上(似乎步幅不能被位图的宽度整除)它返回混合值:
Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
Dim bmpData As System.Drawing.Imaging.BitmapData = bmp.LockBits(rect, Imaging.ImageLockMode.ReadOnly, Imaging.PixelFormat.Format24bppRgb)
Dim ptr As IntPtr = bmpData.Scan0
Dim cols As New List(Of Color)
Dim bytes As Integer = Math.Abs(bmpData.Stride) * bmp.Height
Dim rgbValues(bytes - 1) As Byte
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes)
' Retrieve RGB values
For i = modByte To rgbValues.Length Step 3
cols.Add(Color.FromArgb(rgbValues(i + 2), rgbValues(i + 1), rgbValues(i)))
Next
bmp.UnlockBits(bmpData)
bmp.Dispose()
Dim colsCnt As List(Of RgbPixels) = cols.GroupBy(Function(g) New With {Key .R = g.R, Key .G = g.G, Key .B = g.B}).Select(Function(s) New RgbPixels With {.Colour = Color.FromArgb(s.Key.R, s.Key.G, s.Key.B), .Amount = s.Count()}).ToList()
对结果颜色进行分组后,值类似于:
R G B
255 255 255
255 255 0
255 0 0
0 0 255
0 255 255
或者一些变体,当它们应该是:
R G B
255 255 255
0 0 0
请指出正确的方向,顺便说一句,我的源 bmp 也在 PixelFormat.Format24bppRgb 中,所以我不认为这是问题所在。此外,如果您只能用 C# 回答,那也不是问题。