http://blog.csdn.net/yunque100/article/details/5839534
bmpGray = new Bitmap("validCode.bmp");
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < bmpGray.Height; i++)
{
for (int j = 0; j < bmpGray.Width; j++)
{
Color color = bmpGray.GetPixel(j, i);
int aver = (color.R + color.G + color.B) / 3;
bmpGray.SetPixel(j, i, Color.FromArgb(aver, aver, aver));
}
}
stopwatch.Stop();
Stopwatch stopwatch2 = new Stopwatch();
stopwatch2.Start();
bmpGray = new Bitmap("validCode.bmp");
Rectangle rect = new Rectangle(1, 1, bmpGray.Width - 2, bmpGray.Height - 2);
BitmapData bmpData = bmpGray.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
IntPtr ptr = bmpData.Scan0;
for (int i = 0; i < rect.Height; i++)
{
for (int j = 0; j < rect.Width; j++)
{
int aver = 0;
for (int k = 0; k < 3; k++)
{
aver += Marshal.ReadByte(ptr, i * bmpData.Stride + j * 3 + k);
}
aver /= 3;
for (int k = 0; k < 3; k++)
{
Marshal.WriteByte(ptr, i * bmpData.Stride + j * 3 + k, (byte)aver);
}
}
}
bmpGray.UnlockBits(bmpData);
stopwatch2.Stop();
Stopwatch stopwatch3 = new Stopwatch();
stopwatch3.Start();
bmpGray = new Bitmap("validCode.bmp");
Rectangle rect2 = new Rectangle(1, 1, bmpGray.Width - 2, bmpGray.Height - 2);
BitmapData bmpData2 = bmpGray.LockBits(rect2, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
IntPtr ptr2 = bmpData2.Scan0;
byte[] rgbValues = new byte[rect2.Height * rect2.Width * 3];
Marshal.Copy(ptr2, rgbValues, 0, rgbValues.Length);
for (int i = 0; i < rgbValues.Length; i += 3)
{
int colorTemp = rgbValues[i] + rgbValues[i + 1] + rgbValues[i + 2];
colorTemp /= 3;
rgbValues[i] = rgbValues[i + 1] = rgbValues[i + 2] = (byte)colorTemp;
}
Marshal.Copy(rgbValues, 0, ptr2, rgbValues.Length);
bmpGray.UnlockBits(bmpData);
stopwatch3.Stop();
Stopwatch stopwatch4 = new Stopwatch();
stopwatch4.Start();
bmpGray = new Bitmap("validCode.bmp");
Rectangle rect4 = new Rectangle(1, 1, bmpGray.Width - 2, bmpGray.Height - 2);
BitmapData bmpData4 = bmpGray.LockBits(rect4, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe
{
byte* ptr4 = (byte*)(bmpData4.Scan0);
for (int i = 0; i < rect4.Height; i++)
{
for (int j = 0; j < rect4.Width; j++)
{
int aver = 0;
for (int k = 0; k < 3; k++)
{
aver += ptr4[i * bmpData4.Stride + j * 3 + k];
}
aver /= 3;
for (int k = 0; k < 3; k++)
{
ptr4[i * bmpData4.Stride + j * 3 + k] = (byte)aver;
}
}
}
}
bmpGray.UnlockBits(bmpData4);
stopwatch4.Stop();