Как конвертировать картинку в пазл?

Я хочу, чтобы программа получала фото пользователя, затем конвертировала изображение в пазл (например, 100 штук), а затем делала 100 изображений.

Я использовал этот следующий код для 4 и 9 шт.

if (Image_Num.SelectedIndex == 0)
        {
            PB = new PictureBox[4];

            int W, H;
            var imgarray = new Image[4];
            var img = User_Image.Image;
            W = img.Width / 2;
            H = img.Height / 2;
            for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    var index = i * 2 + j;
                    imgarray[index] = new Bitmap(W, H);
                    var graphics = Graphics.FromImage(imgarray[index]);
                    graphics.DrawImage(img, new Rectangle(0, 0, W, H), new Rectangle(i * W, j * H, W, H), GraphicsUnit.Pixel);
                    graphics.Dispose();
                }
            }

            PB[0] = new PictureBox
            {
                Name = "P1",
                Size = new Size(100, 100),
                Location = new Point(394, 60),
                Image = imgarray[0],
                SizeMode = PictureBoxSizeMode.StretchImage
            };
            ...

            PB[0].MouseEnter += Images_M_E;
            ...


            PB[0].MouseLeave += Images_M_L;
            ...


            PB[0].MouseClick += Images_C;
            ...

            Controls.Add(PB[0]);
            ...
        }

Я не могу сделать это 100 или более раз.

Благодарю.

1 ответ

Решение

Вот пример: код взят из вашего вопроса с минимальными изменениями, чтобы сделать его гибким; Я реализовал вышеупомянутые комментарии, но не выходил за рамки этого.

Я надеюсь, вам будет весело изучать это:-)

private void SetUpPuzzle_Click(int parts)  // use the number of parts on each side
{
    Control board = panel1;  // use the control you want to use or the form!
    int total = parts * parts;
    var PB = new PictureBox[total];

    var imgarray = new Image[total];
    var img = User_Image.Image;
    int W = img.Width / parts;
    int H = img.Height / parts;
    int size = 100;
    for (int x = 0; x < parts; x++)
    {
        for (int y = 0; y < parts; y++)
        {
            var index = x * parts + y;
            imgarray[index] = new Bitmap(W, H);
            using (Graphics graphics = Graphics.FromImage(imgarray[index]))
                graphics.DrawImage(img, new Rectangle(0, 0, W, H), 
                                   new Rectangle(x * W, y * H, W, H), GraphicsUnit.Pixel);
            PB[index] = new PictureBox
            {
                Name = "P"+ index,
                Size = new Size(size, size),
                Location = new Point(x * size, y * size),
                Image = imgarray[index],
                SizeMode = PictureBoxSizeMode.StretchImage
            };
            PB[index].MouseEnter += Images_M_E;
            PB[index].MouseLeave += Images_M_L;
            board.Controls.Add(PB[index]);
        }
    }
}

Вы можете перейти на любое (достаточно малое) число. Вы также можете перейти к полному изображению и сделать размер более гибким; 100x100 - последнее магическое число в коде. Но все в ваше время..

Вот два примера общих событий, которые могут использовать все pbox:

private void Images_M_E(object sender, EventArgs e)
{
    PictureBox pb = sender as PictureBox;  // here we get a reference to the actual pbox
    pb.BorderStyle = BorderStyle.FixedSingle;   // do what you..
}
private void Images_M_L(object sender, EventArgs e)
{
    PictureBox pb = sender as PictureBox;
    pb.BorderStyle = BorderStyle.None;   // ..want to do here
}

Я оставил код в значительной степени, как это было; это означает, что не все проблемы решены. На самом деле нет необходимости в массивах. Созданные изображения и pbox добавляются туда, где они принадлежат; нет необходимости хранить дополнительные ссылки в массивах, которые в любом случае выйдут из области видимости после выполнения кода.

Также ваше написание переменных немного запутано. Все частные поля должны быть верблюжьими, поэтому вы не должны использовать заглавную букву! Свойства и классы являются PascalCase. В основном ничто не должно состоять из последовательных заглавных букв (как я видел в ваших предыдущих постах.)

Другие вопросы по тегам