我有一个位图,我想从像素中获取颜色值,但仅在图像的某些区域中获得。我想获得图像的像素的完整宽度,只有一点高度(例如高度= 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大于您的图像实际宽度。您是如何提出这个数字的?