c#指针进行图像操作

提及.NET的指针操作,很多人并不是很了解,甚至还不知道有这么个东东
由于C#的指针操作属于unsafe操作,所以很多人对unsafe使用起来都很谨慎

其实所谓不安全代码,其实是不受控于CLR控制下的托管执行,相当于CLR领导下的部分区域自治,
当然CLR也不会去关心不安全代码的内存分配和回收


费话少说,先体验一下适当的指针操作带来的性能提升。
平时我们通过GDI+操作稍大点图片象素时,都会有一种濒临崩溃的感觉,我们转下用指针操作

 

 

 1    Bitmap map  =   new  Bitmap(path);
 2     //  将图片位图区域进行锁定
 3    BitmapData mapdata  =  map.LockBits( new  Rectangle( 0 0 , map.Width, map.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
 4     unsafe
 5    {
 6         byte *  pixpoint;
 7         int  newpoint;
 8 
 9         for  ( int  i  =   0 ; i  <  map.Width; i ++ )
10        {
11             for  ( int  j  =   0 ; j  <  map.Height; j ++ )
12            {
13                 //  位图结构存在一个字节对齐问题。      
14                pixpoint  =  ( byte * )mapdata.Scan0;  + *   3   +  j  *  mapdata.Stride;
15                newpoint  =  ( * pixpoint  *   11   +   * (pixpoint  +   1 *   59   +   * (pixpoint  +   2 *   30 /   100 ;
16                 * (pixpoint ++ =  ( byte )newpoint;
17                 * (pixpoint ++ =  ( byte )newpoint;
18                 * (pixpoint ++ =  ( byte )newpoint;
19 
20                 //   非指针操作
21                 //   Color pxcl=map.GetPixel(i, j);
22                 //  map.SetPixel(i, j, (pxcl.R * 11 + pxcl.G * 59 + pxcl * 30) / 100);
23            }
24        }
25    }
26     //  将位图内存区域进行解锁
27    map.UnlockBits(mapdata);
28    map.Dispose();

比较GDI+使用的GetPixel/SetPixel,让你立马感到这个世界多么美妙


再来一个中值滤波的操作

   

 1  ///   <summary>
 2  ///  中值滤波
 3  ///   </summary>
 4  ///   <param name="dgGrayValue"></param>
 5  public   void  MedianFilter( int  dgGrayValue)
 6  {
 7  //    100M 双线空间 + 50M数据库  28元/年
 8  //    1G 双线空间    + 200M数据库  100元/年
 9  //                                             QQ:70975363
10       byte  s;
11       byte [] p  =   new   byte [ 9 ];
12       int  i, j;
13       int  x, y;
14       int  Stride;
15       unsafe
16      {
17           byte *  point  =  ( byte * ) this .ImageData.Scan0;
18          Stride  =   this .ImageData.Stride;
19          point  =  point  +   3   +   this .ImageData.Stride;
20           for  (i  =   0 ; i  <   this .ImageData.Height  -   1 ; i ++ )
21          {
22               for  (j  =   0 ; j  <   this .ImageData.Width  -   1 ; j ++ )
23              {
24                  p[ 0 =   * (point  -  Stride  -   1 );
25                  p[ 1 =   * (point  -  Stride  +   2 );
26                  p[ 2 =   * (point  -  Stride  +   5 );
27                  p[ 3 =   * (point  -   1 );
28                  p[ 4 =   * (point  +   2 );
29                  p[ 5 =   * (point  +   5 );
30                  p[ 6 =   * (point  +  Stride  -   1 );
31                  p[ 7 =   * (point  +  Stride  +   2 );
32                  p[ 8 =   * (point  +  Stride  +   5 );
33                   for  (x  =   0 ; x  <   5 ; x ++ )
34                  {
35                       for  (y  =  x  +   1 ; y  <   9 ; y ++ )
36                      {
37                           if  (p[x]  >  p[y])
38                          {
39                              s  =  p[x];
40                              p[x]  =  p[y];
41                              p[y]  =  s;
42                          }
43                      }
44                  }
45                    * point  =  p[ 4 ];
46                   * (point  -   1 =  p[ 4 ];
47                   * (point  -   2 =  p[ 4 ];
48                    point  +=   3 ;
49 
50              }
51              point  +=  Stride  -   this .ImageData.Width  *   3 ;
52          }
53      }   
54  }
55 

你可能感兴趣的:(C#)