解决方案 »

  1.   

    贴出部分代码瞧瞧本来想全部贴出来的,有限制,就画中间矩形那个吧/// <summary>
            /// 绘制中间的矩形
            /// </summary>
            private void DrawSLBitmap()
            {
                if (slBitmap != null)
                    slBitmap.Dispose();            int width = Math.Min(ClientSize.Width, ClientSize.Height)/2;
                if (width < 10)
                {
                    slBitmap = null;
                    return;
                }            // Prepare Bitmap
                slBitmap = new Bitmap(width, width);            BitmapData bmData;
                byte[] bytes;
                BitmapReadBytes(slBitmap, out bytes, out bmData);
                for (int y = 0; y < width; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        Color c = ColorMath.HslToRgb(new HslColor(hue, (byte) (x*255/width), (byte) (y*255/width)));
                        BitmapSetPixel(bytes, bmData, x, y, c);
                    }
                }
                BitmapWriteBytes(slBitmap, bytes, bmData);
            }        private void BitmapReadBytes(Bitmap bmp, out byte[] bytes, out BitmapData bmData)
            {
                bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
                    ImageLockMode.ReadWrite,
                    PixelFormat.Format32bppArgb);
                const int bpp = 4;
                bytes = new byte[bmp.Width*bmp.Height*bpp];
                Marshal.Copy(bmData.Scan0, bytes, 0, bytes.Length);
            }        private void BitmapSetPixel(byte[] bytes, BitmapData bmData, int x, int y, Color c)
            {
                int i = y*bmData.Stride + x*4;
                bytes[i] = c.B;
                bytes[i + 1] = c.G;
                bytes[i + 2] = c.R;
                bytes[i + 3] = c.A;
            }        private void BitmapWriteBytes(Bitmap bmp, byte[] bytes, BitmapData bmData)
            {
                Marshal.Copy(bytes, 0, bmData.Scan0, bytes.Length);
                bmp.UnlockBits(bmData);
            }        private double GetDistance(Point a, Point b)
            {
                return Math.Sqrt((a.X - b.X)*(a.X - b.X) + (a.Y - b.Y)*(a.Y - b.Y));
            }