本函数完成的功能是对图像进行加噪处理,参数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 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 }