如何在一个面板中保存多个图片框?
How do I save several pictureboxes inside a panel?
我有一个包含多个控件和 4 个图像的面板。 4张图片在一个框架内。现在我只想将 4 个图片框(在框架中)保存到 jpg 文件中,但是图片框都是白色的,我只能在保存的图像中看到面板。
Bitmap bmp = new Bitmap(frame.Width, frame.Height);
Rectangle rect = new Rectangle(0, 0, frame.Width, frame.Height);
this.panel1.DrawToBitmap(bmp, rect);
bmp.Save("C:\Temp\zo.jpg", ImageFormat.Jpeg);
我该怎么做?
有(至少)两种方法:
- 如果
PictureBoxes
可以在不切断图像的情况下实际显示图像,那么您的代码中的那个就可以正常工作。注意:PictureBoxes
必须真正位于 里面 Panel
(即必须是他们的 Parent
),否则不会绘制他们!
这是一个工作示例:
private void button1_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(panel1.ClientSize.Width, panel1.ClientSize.Height);
using (Graphics G = Graphics.FromImage(bmp))
panel1.DrawToBitmap(bmp, panel1.ClientRectangle);
// now we can save it..
bmp.Save("d:\foursome.jpg", ImageFormat.Jpeg);
// and let it go:
bmp.Dispose();
}
- 另一种方式使用
DrawImage
在代码中绘制Images
。
它更复杂,但给了你更多的控制权:
private void button2_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(panel1.ClientSize.Width, panel1.ClientSize.Height);
int x1 = 0;
int x2 = Math.Max(pictureBox1.Image.Width, pictureBox3.Image.Width);
int y1 = 0;
int y2 = Math.Max(pictureBox1.Image.Height, pictureBox2.Image.Height);
Rectangle rect1 = new Rectangle(new Point(x1, y1), pictureBox1.Image.Size);
Rectangle rect2 = new Rectangle(new Point(x2, y1), pictureBox2.Image.Size);
Rectangle rect3 = new Rectangle(new Point(x1, y2), pictureBox3.Image.Size);
Rectangle rect4 = new Rectangle(new Point(x2, y2), pictureBox4.Image.Size);
using (Graphics G = Graphics.FromImage(bmp))
{
G.DrawImage(pictureBox1.Image, rect1);
G.DrawImage(pictureBox2.Image, rect2);
G.DrawImage(pictureBox3.Image, rect3);
G.DrawImage(pictureBox4.Image, rect4);
}
bmp.Save("d:\foursome2jpg", ImageFormat.Jpeg);
// and clean up:
bmp.Dispose();
}
这不仅可以让您添加或删除图像之间的间距,还可以让您使用 this DrawImage format 调整它们的大小。当然,您可以添加任何您想要的内容,eg.g 精美的框架或文本..
我有一个包含多个控件和 4 个图像的面板。 4张图片在一个框架内。现在我只想将 4 个图片框(在框架中)保存到 jpg 文件中,但是图片框都是白色的,我只能在保存的图像中看到面板。
Bitmap bmp = new Bitmap(frame.Width, frame.Height);
Rectangle rect = new Rectangle(0, 0, frame.Width, frame.Height);
this.panel1.DrawToBitmap(bmp, rect);
bmp.Save("C:\Temp\zo.jpg", ImageFormat.Jpeg);
我该怎么做?
有(至少)两种方法:
- 如果
PictureBoxes
可以在不切断图像的情况下实际显示图像,那么您的代码中的那个就可以正常工作。注意:PictureBoxes
必须真正位于 里面Panel
(即必须是他们的Parent
),否则不会绘制他们!
这是一个工作示例:
private void button1_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(panel1.ClientSize.Width, panel1.ClientSize.Height);
using (Graphics G = Graphics.FromImage(bmp))
panel1.DrawToBitmap(bmp, panel1.ClientRectangle);
// now we can save it..
bmp.Save("d:\foursome.jpg", ImageFormat.Jpeg);
// and let it go:
bmp.Dispose();
}
- 另一种方式使用
DrawImage
在代码中绘制Images
。
它更复杂,但给了你更多的控制权:
private void button2_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(panel1.ClientSize.Width, panel1.ClientSize.Height);
int x1 = 0;
int x2 = Math.Max(pictureBox1.Image.Width, pictureBox3.Image.Width);
int y1 = 0;
int y2 = Math.Max(pictureBox1.Image.Height, pictureBox2.Image.Height);
Rectangle rect1 = new Rectangle(new Point(x1, y1), pictureBox1.Image.Size);
Rectangle rect2 = new Rectangle(new Point(x2, y1), pictureBox2.Image.Size);
Rectangle rect3 = new Rectangle(new Point(x1, y2), pictureBox3.Image.Size);
Rectangle rect4 = new Rectangle(new Point(x2, y2), pictureBox4.Image.Size);
using (Graphics G = Graphics.FromImage(bmp))
{
G.DrawImage(pictureBox1.Image, rect1);
G.DrawImage(pictureBox2.Image, rect2);
G.DrawImage(pictureBox3.Image, rect3);
G.DrawImage(pictureBox4.Image, rect4);
}
bmp.Save("d:\foursome2jpg", ImageFormat.Jpeg);
// and clean up:
bmp.Dispose();
}
这不仅可以让您添加或删除图像之间的间距,还可以让您使用 this DrawImage format 调整它们的大小。当然,您可以添加任何您想要的内容,eg.g 精美的框架或文本..