C# 如何将图像转换为拼图?
我想程序得到一个用户的图片,然后将图像转换为拼图(例如100块),然后制作100个图片框 我使用下面的代码处理4和9件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;
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
}