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

开发 后端
提及.NET中的C#指针操作,很多人并不是很了解,甚至还不知道有这么个东西。本文将为大家讲解如何利用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作用浅析

责任编辑:彭凡 来源: cnblogs
相关推荐

2009-08-03 17:12:40

C#指针操作

2009-08-20 10:25:37

C#操作内存

2009-08-18 17:29:02

C#使用指针

2009-07-31 15:10:21

C#函数指针数组C#数组

2009-08-21 15:16:23

C#使用指针

2009-08-13 15:48:57

C#指针

2009-08-18 17:37:57

C#固定指针

2009-08-19 16:50:32

Visual C#C#语言特性

2009-08-31 15:02:22

C#解析结构体指针

2009-09-16 09:00:15

C#数组C#指针

2009-09-27 11:14:09

C#数组

2024-09-18 07:10:00

ImageSharpC#开发

2009-08-17 13:34:02

C#异步操作

2009-08-12 15:43:02

操作C# Datase

2009-07-31 18:28:46

实现C#显示图像

2009-08-28 15:32:39

C#利用WMI获取数据

2009-09-08 16:51:50

C#鼠标拖动

2009-08-28 15:52:23

C#利用sharpzi

2009-08-28 16:08:28

C#利用资源文件

2009-09-07 18:08:25

C#鼠标指针
点赞
收藏

51CTO技术栈公众号