给你一个例子吧,这是我自己写的一个代码,仅供参考哦
private double[] GetGrayArray(Bitmap srcBmp)
{
int left = 0;
int top = 0;
int width = srcBmp.Width;
int height = srcBmp.Height;
Rectangle rect = new Rectangle(left, top, width, height);
//将Bitmap锁定到系统内存中,获得BitmapData
//这里的第三个参数确定了该图像信息时rgb存储还是Argb存储
BitmapData srcBmpData = srcBmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
//位图中第一个像素数据的地址。它也可以看成是位图中的第一个扫描行
IntPtr srcPtr = srcBmpData.Scan0;
//将Bitmap对象的信息存放到byte数组中
//int src_bytes = srcBmpData.Stride * height;
int src_bytes = width * 3 * height;
//int srcStride = srcBmpData.Stride;
byte[] srcRGBValues = new byte[src_bytes];
double[] grayValues = new double[width * height];
//RGB[] rgb = new RGB[srcBmp.Width * rows];
//复制GRB信息到byte数组
Marshal.Copy(srcPtr, srcRGBValues, 0, src_bytes);
//Marshal.Copy(dstPtr, dstValues, 0, dst_bytes);
//解锁位图
srcBmp.UnlockBits(srcBmpData);
//灰度化处理
int m = 0, j = 0;
int k = 0;
double gray = 0.00;
//double sumGrayValue = 0.00;
//根据Y = 0.299*R + 0.587*G + 0.114*B,intensity为亮度
for (int i = 0; i < height; i++)
//只获取图片的rows行像素值
{
for (j = 0; j < width; j++)
{
//只处理每行中图像像素数据,舍弃未用空间
//注意位图结构中RGB按BGR的顺序存储
k = 3 * j;
gray = (double)(srcRGBValues[i * width + k + 2] * 0.299
+ srcRGBValues[i * width + k + 1] * 0.587
+ srcRGBValues[i * width + k + 0] * 0.114);
grayValues[m] = gray;
//将灰度值存到double的数组中
m++;
//sumGrayValue = sumGrayValue + gray;
//计算所有扫描到的像素的灰度值
}
}
return grayValues;
}