[英]Save an Image/Bitmap from hidden panels
我有一个带有四个选项卡的TabControl,每个选项卡都包含一个面板。 我想一键保存所有面板,但是我只能将面板保存在前面。
有人知道另一种方式吗?
Bitmap eins = new Bitmap(p1.Width, p1.Height);
eins.Save(".string."+1+".jpg",System.Drawing.Imaging.ImageFormat.Jpeg);
我看不到要在Bitmap
中填充任何内容的位置。
无论TabPage
是哪个TabPage
,这对您的所有Panels
均适用:
foreach (Panel px in new Panel[] { p1, p2, p3, p4 } )
using (Bitmap bmp = new Bitmap(pX.ClientSize.Width, pX.ClientSize.Height))
{
pX.DrawToBitmap(bmp, pX.ClientRectangle);
bmp.Save(somefolder + pX.Name + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
实际上,即使Panels
实际上是 不可见的 ,而不仅仅是在隐藏的TabPages
之一中,它甚至也可以工作!
当然,您必须确保Panels
具有唯一且符合文件名的Names
。
更新 :现在,我知道您在Panel
内有Controls
,而不仅仅是您绘制的图形,还有BackgroundImage
,我可以理解您遇到的问题。
不幸的是, TabPages
具有隐藏嵌入式控件的讨厌方法。
因此,我编写了一个小帮助程序,该程序不会导致主窗体处于不活动状态并返回的瞬间。
void SaveHiddencontrol(Control ctl, string fileName)
{
Control originalParent = ctl.Parent;
Form fff = new Form();
fff.Opacity = 0;
ctl.Parent = fff;
fff.Show();
System.Drawing.Imaging.ImageFormat fmt = System.Drawing.Imaging.ImageFormat.Jpeg;
if (fileName.ToLower().EndsWith(".png")) fmt = System.Drawing.Imaging.ImageFormat.Png;
using (Bitmap bmp = new Bitmap(ctl.ClientSize.Width, ctl.ClientSize.Height))
{
ctl.DrawToBitmap(bmp, ctl.ClientRectangle);
bmp.Save(fileName, fmt);
}
ctl.Parent = originalParent;
fff.Close();
}
结果如下:
注意如何Form
本身是完全透明的 ,但让Panel
做了DrawToBitmap
就好了,包括图像,椭圆形和两个控制,甚至独立的Form.Size
..!
Update2这是一个根本不闪烁的函数,至少在面板确实不可见的情况下:
void SaveHiddencontrol(Control ctl, string fileName)
{
Control originalParent = ctl.Parent;
int oldLeft = ctl.Left;
ctl.Left = 22222; // way outside
ctl.Parent = this;
System.Drawing.Imaging.ImageFormat fmt = System.Drawing.Imaging.ImageFormat.Jpeg;
if (fileName.ToLower().EndsWith(".png")) fmt = System.Drawing.Imaging.ImageFormat.Png;
using (Bitmap bmp = new Bitmap(ctl.ClientSize.Width, ctl.ClientSize.Height))
{
ctl.DrawToBitmap(bmp, ctl.ClientRectangle);
bmp.Save(fileName, fmt);
}
ctl.Parent = originalParent;
ctl.Left = oldLeft;
}
这只是将Panel
移动到主Form
而是way to the right
,因此它不会显示。 然后保存并将其移回。 当然,您应该检查Panel
是否确实在隐藏的TabPage
,否则它将闪烁。 在这种情况下,原始例程将可以执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.