• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c#指针进行图像操作

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

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


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

 

 

 1   Bitmap map = new Bitmap(path);
 2   // 将图片位图区域进行锁定
 3   BitmapData mapdata = map.LockBits(new Rectangle(00, 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 

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
小猪猪逆袭成博士之C++基础篇(三)字符串发布时间:2022-07-14
下一篇:
C#中this关键字四种用法发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap