您的位置:首页 > 编程语言 > C#

C#访问BitMap几种方法效率比较

2010-08-26 09:52 477 查看
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();


result:

stopwatch
{System.Diagnostics.Stopwatch}
elapsed: 0x0000000394eabae0
Elapsed: {00:00:04.8191978}
ElapsedMilliseconds: 0x00000000000012d3
ElapsedTicks: 0x0000000394eabae0
IsRunning: false
isRunning: false
startTimeStamp: 0x000017d9416c6260
stopwatch2
{System.Diagnostics.Stopwatch}
elapsed: 0x0000000049f480f0
Elapsed: {00:00:00.3886984}
ElapsedMilliseconds: 0x0000000000000184
ElapsedTicks: 0x0000000049f480f0
IsRunning: false
isRunning: false
startTimeStamp: 0x000017dcd65729e0
stopwatch3
{System.Diagnostics.Stopwatch}
elapsed: 0x000000000c25bb00
Elapsed: {00:00:00.0638450}
ElapsedMilliseconds: 0x000000000000003f
ElapsedTicks: 0x000000000c25bb00
IsRunning: false
isRunning: false
startTimeStamp: 0x000017dd204bbdb0
stopwatch4
{System.Diagnostics.Stopwatch}
elapsed: 0x00000000164bec10
Elapsed: {00:00:00.1171879}
ElapsedMilliseconds: 0x0000000000000075
ElapsedTicks: 0x00000000164bec10
IsRunning: false
isRunning: false
startTimeStamp: 0x000017dd2c7186b0


We can see that,the Method 3 is highly-efficient.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: