C# 如何将图像转换为拼图?

C# 如何将图像转换为拼图?,c#,image,picturebox,C#,Image,Picturebox,我想程序得到一个用户的图片,然后将图像转换为拼图(例如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;

我想程序得到一个用户的图片,然后将图像转换为拼图(例如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]);
            ...
        }
if(Image\u Num.SelectedIndex==0)
{
PB=新的PictureBox[4];
int W,H;
var Imgaray=新图像[4];
var img=用户\图像.Image;
W=最小宽度/2;
H=最小高度/2;
对于(int i=0;i<2;i++)
{
对于(int j=0;j<2;j++)
{
var指数=i*2+j;
imgaray[index]=新位图(W,H);
var graphics=graphics.FromImage(imgaray[index]);
graphics.DrawImage(img,新矩形(0,0,W,H),新矩形(i*W,j*H,W,H),GraphicsUnit.Pixel);
graphics.Dispose();
}
}
PB[0]=新图片盒
{
Name=“P1”,
尺寸=新尺寸(100100),
位置=新点(394,60),
Image=imgarray[0],
SizeMode=PictureBoxSizeMode.StretchImage
};
...
PB[0].鼠标指针+=图像;
...
PB[0].鼠标移动+=图像;
...
PB[0]。鼠标单击+=图像\u C;
...
添加(PB[0]);
...
}
我不能这样做100次甚至更多


谢谢。

这里有一个例子:代码取自您的问题,只需稍加修改即可使之灵活;我已经实施了上述评论,但没有超出这一范围

我希望你学习它会很开心:-)

我让代码保持原样;这意味着并非所有问题都得到解决。实际上,对阵列没有明显的需求。创建的图像和pbox都添加到它们所属的位置;不需要在数组中保留额外的引用,在代码运行完之后,这些引用无论如何都会超出范围


此外,变量的拼写也有点混乱。所有私人文件都应该是camelCase,所以第一个字母不能大写!属性和类是PascalCase。基本上,没有什么应该由连续的大写字母组成(正如我在之前的文章中看到的那样)。

您需要学习以更有用的方式使用变量。要设置10x10拼图,您需要一个变量xyparts=10;如果你想要一个非正方形的拼图,请选择xParts和yParts现在,整个工作在双循环中进行。不要调用循环计数器i和j!叫他们x和y或col和row!始终使文本可读!-使用变量来计算循环限制,当然还有位置!!避免代码中的“神奇”数字!您可以在循环中创建PBOX,创建和分配图像,还可以连接事件的代码。所有PBOX都应该使用相同的事件!在这些场景中,首先将
发送者
转换为
图片盒
!当您尝试实现更改时,一定要询问更多提示。这里有太多问题:您应该在绘制事件处理程序中绘制;您不应该为拼图的每个部分创建单独的
PictureBox
控件。你需要一本书或一本教程,学习如何画图。@Dour:好建议;但是他真的很年轻,我们不能指望他从一开始就把事情做好。首先,这是“循环”;-)席是什么?你没有给它下定义,只是打字错误。(我在SO编辑器中更改了I->x和j->y;-)谢谢。这很有效
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]);
        }
    }
}
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
}