图象处理算法(七)

七、扩散
  将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(00, 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        }
原文地址:https://www.cnblogs.com/faib/p/664285.html