从位图C#中的各个位置获取颜色值



我有一个位图,我想从像素中获取颜色值,但仅在图像的某些区域中获得。我想获得图像的像素的完整宽度,只有一点高度(例如高度= 1),然后我想将位置移至一个下方并获得相同的值。

我正在使用

for (int i = 0; i < 302; i++)
{ 
    Rectangle cloneRect = new Rectangle(0, i, 514, 1);
    System.Drawing.Imaging.PixelFormat format = bm.PixelFormat;
    Bitmap cloneBitmap = bm.Clone(cloneRect, format);
    bitMapList.Add(cloneBitmap);
}
foreach (Bitmap bmp in bitMapList)
{
    c = bmp.GetPixel(514, 1);
    r = Convert.ToInt16(c.R);
    lumi.Add(r);
}

for语句可以在位图上创建我想要的区域,然后foreach通过这些位图循环,然后获取值。唯一的问题是我收到错误消息"参数必须为正面和宽度"。

在线上

c = bmp.GetPixel(514, 1);

有人知道为什么吗?

谢谢

您需要确保所获得的像素在图像内(不可能是这样)。您可以将其包装在通话中以首先运行支票,例如:

public static Color GetPixelSafe(Bitmap image, int x, int y) {
    if (x >= image.Width) x = image.Width - 1;
    else if (x < 0) x = 0;
    if (y >= image.Height) y = image.Height - 1;
    else if (y < 0) y = 0;
    return image.GetPixel(x, y);
}

现在,这不会修复您的处理算法本身,但至少应该修复例外。另一个指针是,如果您要处理颜色值和性能的批次是一个问题,那么您应该真正考虑使用image.LockBits而不是GetPixel。有关此信息的更多信息,请参见:http://msdn.microsoft.com/en-us/library/5ey6h79d(v = vs.110).aspx。

似乎514大于您的图像实际宽度。您是如何提出这个数字的?

最新更新