当前位置:编程学习 > C#/ASP.NET >>

wpf大图片处理速度优化:指针操作,并行操作,几十倍优化

我一直用GDI+做Winform 的基于指针的图片处理,这次下决心全部移到wpf上(主要是显示布局很方便)
采用的图片是
2512*3307 的大图 830万像素
类库基于WritableBitmapEx 的wpf版本
函数是我自己写的扩展方法,只是利用了 writableBitmapEx提供的环境 ,我懒得从头到尾自己写了
 
1.标准int32数组遍历计算 release
0.28s

        unsafe public static void TestGray1(this WriteableBitmap bmp)
        {
            using (var context = bmp.GetBitmapContext())
            {
                int height = context.Height;
                int width = context.Width;
                for (int y = 0; y < height; y++)
                {                   
                    for (int x = 0; x < width; x++)
                    {
                        int pos=y * context.Width + x;
                        var c = context.Pixels[pos];
                        var r = (byte)(c >> 16);
                        var g = (byte)(c >> 8);
                        var b = (byte)(c);
                       
                        var gray = ((r * 38 + g * 75 + b * 15) >> 7);

                        var color=(255 << 24) | (gray << 16) | (gray << 8) | gray;
                        context.Pixels[pos]=color;
                    }
                }
            }
        }

 

2.标准int32指针遍历计算 release

0.04s


        unsafe public static void TestGray2(this WriteableBitmap bmp)
        {
            using (var context = bmp.GetBitmapContext())
            {
                var ptr = context.Pixels;

                int height = context.Height;
                int width = context.Width;
                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        var c = *ptr;
                        var r = (byte)(c >> 16) ;
                        var g = (byte)(c >> 8) ;
                        var b = (byte)(c) ;

                        var gray = ((r * 38 + g * 75 + b * 15) >> 7);

                        var color = (255 << 24) | (gray << 16) | (gray << 8) | gray;
                        *ptr = color;

                        ptr++;
                    }
                }
            }
        }

 

3.colorstruct指针 遍历计算

0.02 s

应该是已经到极限速度了[除了后面的并行方式],我已经想不出还有什么方法可以提高处理速度

而且这种方式是最直观的,最容易理解的处理方式,也便于以后维护


 


    [StructLayout(LayoutKind.Sequential)]
    public struct PixelColor
    {
        public byte Blue;
        public byte Green;
        public byte Red;
        public byte Alpha;
    }

 


        unsafe public static void TestGray3(this WriteableBitmap bmp)
        {
            using (var context = bmp.GetBitmapContext())
            {
                var ptr = (PixelColor*)context.Pixels;

                int height = context.Height;
          &nb

补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,