winfrom-图片拆分成多块

先在panel容器(长宽为300)中绘制一个宫格,比如下面这样:

winfrom-图片拆分成多块_第1张图片

private void Form1_Load(object sender, EventArgs e)
        {
            this.InitRandomPictureBox();
        }
        
        private void InitRandomPictureBox()
        {
            this.pnl_Random.Controls.Clear();
            for (int i = 0; i < this.ImgNumbers; i++)
            {
                for (int j = 0; j < this.ImgNumbers; j++)
                {
                    PictureBox pic = new PictureBox();
                    pic.Location = new Point(j * this.SideLength, i * this.SideLength);
                    pic.Size = new Size(this.SideLength, this.SideLength);
                    pic.Visible = true;
                    pic.BorderStyle = BorderStyle.FixedSingle;

                    this.pnl_Random.Controls.Add(pic);
                }
            }
        }
/// 
        /// 每个方向上要切割成的块数
        /// 
        private int ImgNumbers
        {
            get
            {
                return 3;
            }
        }
        /// 
        /// 要切割成的正方形图片边长
        /// 
        private int SideLength
        {
            get
            {
                return 300 / this.ImgNumbers; //300:panel容器大小
            }
        }
//图片切割:
/// 
        /// 将图片切割成小图片,图片顺序为先水平后垂直
        /// 
        /// 水平方向多少个图片
        ///垂直方向多少个图片
        public static Image[] SplitToSmallImages(this Image fromImage, int cx, int cy)
        {
            Image[] imgs = new Image[cx * cy];

            int nWidth = fromImage.Width / cx;
            int nHeight = fromImage.Height / cy;

            Bitmap image = new Bitmap(nWidth, nHeight);
            Graphics graphics = Graphics.FromImage(image);

            for (int i = 0; i < cy; i++)
            {
                for (int j = 0; j < cx; j++)
                {
                    graphics.DrawImage(fromImage, 0, 0, new Rectangle(j * nWidth, i * nHeight, nWidth, nHeight), GraphicsUnit.Pixel);
                    Image img = Image.FromHbitmap(image.GetHbitmap());
                    int idx = j + i * cx;
                    img.Tag = idx;
                    imgs[idx] = img;
                }
            }

            return imgs;
        }
将切好的图片随机排序然后放入到容器中:
var tmp = this._splitImages.OrderBy(p => Guid.NewGuid()).ToList();
            for (int i = 0; i < tmp.Count; i++)
            {
                this._splitPictureBoxes[i].Image = tmp[i];
            }

winfrom-图片拆分成多块_第2张图片

你可能感兴趣的:(Winfrom)