利用C#指针进行图像操作

由于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; +i * 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,让你立马感到这个世界多么美妙

再来一个中值滤波的操作

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

【编辑推荐】

  1. 你知道C#排序的编写及性能吗?
  2. C#中用鼠标移动页面功能的实现
  3. C#实例讲解二叉树原理与实现
  4. C# 2010命名和可选参数的新特性
  5. C# 4.0新特性dynamic作用浅析

本文标题:利用C#指针进行图像操作
网站URL:http://www.csdahua.cn/qtweb/news33/534333.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网