Chinaunix首页 | 论坛 | 博客
  • 博客访问: 320262
  • 博文数量: 23
  • 博客积分: 2115
  • 博客等级: 大尉
  • 技术积分: 371
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-15 16:36
文章分类

全部博文(23)

文章存档

2013年(4)

2012年(4)

2011年(3)

2010年(6)

2009年(5)

2008年(1)

我的朋友

分类: C/C++

2009-03-06 10:47:30

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) |
给主人留下些什么吧!~~