将xOffset与yOffset范围内的随机点颜色值移到当前位置显示。换种方式说,也就是将当前的点移到其他位置显示。p1 + stride * yIn + xIn * 3是偏移量的计算方式。
1 public static bool Diffuse(Bitmap b, int xOffset, int yOffset, 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 byte * p1 = p;
11 int nOffset = stride - b.Width*3;
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 xIn = rad.Next(2 * xOffset) - xOffset + x;
20 int yIn = rad.Next(2 * yOffset) - yOffset + y;
21 if(xIn < 1)xIn = 0;
22 else if(xIn > b.Width - 1)xIn = b.Width - 1;
23 if(yIn < 1)yIn = 0;
24 else if(yIn > b.Height - 1)yIn = b.Height - 1;
25 byte * pTemp = p1 + stride * yIn + xIn * 3;
26 p[0] = pTemp[0];
27 p[1] = pTemp[1];
28 p[2] = pTemp[2];
29 }
30 p += 3;
31 }
32 p += nOffset;
33 }
34 }
35 b.UnlockBits(bmData);
36 return true;
37 }
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 byte * p1 = p;
11 int nOffset = stride - b.Width*3;
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 xIn = rad.Next(2 * xOffset) - xOffset + x;
20 int yIn = rad.Next(2 * yOffset) - yOffset + y;
21 if(xIn < 1)xIn = 0;
22 else if(xIn > b.Width - 1)xIn = b.Width - 1;
23 if(yIn < 1)yIn = 0;
24 else if(yIn > b.Height - 1)yIn = b.Height - 1;
25 byte * pTemp = p1 + stride * yIn + xIn * 3;
26 p[0] = pTemp[0];
27 p[1] = pTemp[1];
28 p[2] = pTemp[2];
29 }
30 p += 3;
31 }
32 p += nOffset;
33 }
34 }
35 b.UnlockBits(bmData);
36 return true;
37 }