本函数完成的功能是对图像进行加噪处理,参数Level是噪音的严重程度,Step是范围大小。函数的unsafe代码部分对每个象素点的不同颜色成分进行逐个处理,通过随机产生的值,来决定增或减的大小。函数最后执行成功后,同样得返回true值。
1
public static bool Noise(Bitmap b, int Level, int Step)
2
{
3
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),
4
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
5
int stride = bmData.Stride;
6
System.IntPtr Scan0 = bmData.Scan0;
7
unsafe
8
{
9
byte * p = (byte *)(void *)Scan0;
10
int nOffset = stride - b.Width*3;
11
int blue = 0, green = 0, red = 0;
12
Random rad = new Random();
13
for(int y=0;y<b.Height;++y)
14
{
15
for(int x=0; x < b.Width; ++x )
16
{
17
if(y % Step == 0 && x % Step == 0)
18
{
19
int mLev = rad.Next(2 * Level) - Level;
20
blue = p[0] + mLev;
21
green = p[1] + mLev;
22
red = p[2] + mLev;
23
if(blue < 0)blue = 0;
24
else if(blue > 255)blue = 255;
25
if(green < 0)green = 0;
26
else if(green > 255)green = 255;
27
if(red < 0)red = 0;
28
else if(red > 255)red = 255;
29
p[0] = (byte)blue;
30
p[1] = (byte)green;
31
p[2] = (byte)red;
32
}
33
p += 3;
34
}
35
p += nOffset;
36
}
37
}
38
b.UnlockBits(bmData);
39
return true;
40
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40
