在指定大小的范围内,图象的颜色取成相同的。
1 public static bool Mosaic(Bitmap b, int PixelSize)
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 % PixelSize == 0)
18 {
19 if (x % PixelSize == 0)
20 {
21 blue = p[0]; green = p[1]; red = p[2];
22 }
23 else
24 {
25 p[0] = (byte)blue;
26 p[1] = (byte)green;
27 p[2] = (byte)red;
28 }
29 }
30 else
31 {
32 byte * pTemp = p - bmData.Stride;
33
34 p[0] = (byte)pTemp[0];
35 p[1] = (byte)pTemp[1];
36 p[2] = (byte)pTemp[2];
37 }
38 p += 3;
39 }
40 p += nOffset;
41 }
42 }
43 b.UnlockBits(bmData);
44 return true;
45 }
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 % PixelSize == 0)
18 {
19 if (x % PixelSize == 0)
20 {
21 blue = p[0]; green = p[1]; red = p[2];
22 }
23 else
24 {
25 p[0] = (byte)blue;
26 p[1] = (byte)green;
27 p[2] = (byte)red;
28 }
29 }
30 else
31 {
32 byte * pTemp = p - bmData.Stride;
33
34 p[0] = (byte)pTemp[0];
35 p[1] = (byte)pTemp[1];
36 p[2] = (byte)pTemp[2];
37 }
38 p += 3;
39 }
40 p += nOffset;
41 }
42 }
43 b.UnlockBits(bmData);
44 return true;
45 }