GDI+中的著名烂函数-setpixel & getpixel
作用是获得一个象素点的颜色和设置一个象素点的颜色。
下面是一个代码片断(为了把位图的某种颜色替换为另一种颜色),测试中在100x100位图中试验了以下代码,竟然消耗了500ms左右,这函数写的真是垃圾的可以。
for (int x = 0; x < image.Width; x++) { for (int y = 0; y < image.Height; y++) { Color pixelColor = ((Bitmap)image).GetPixel(x, y); if ((pixelColor.R == oldColor.R) && (pixelColor.G == oldColor.G) && (pixelColor.B == oldColor.B)) ((Bitmap)image).SetPixel(x, y, newColor); } }
|
还好,C#可以通过unsafe直接访问内存,自己重写了一下,速度竟然有非常大的改进->0ms。看来DotNet某些函数的效率真是……
unsafe { Bitmap bmp = (Bitmap)image; int width = bmp.Width; int height = bmp.Height; BitmapData bmdata = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); byte* p = (byte*)bmdata.Scan0; int offset = bmdata.Stride - width * 3;
for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { if ((p[0] == oldColor.R) && (p[1] == oldColor.G) && (p[2] == oldColor.B)) { p[0] = newColor.B; p[1] = newColor.G; p[2] = newColor.R; } p += 3; } p += offset; } bmp.UnlockBits(bmdata); image = bmp; }
|
阅读(3219) | 评论(0) | 转发(0) |