从隐藏面板中保存 Image/Bitmap
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
.
中填写了什么
这应该适用于所有 Panels
,无论他们在哪个 TabPage
:
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
实际上 不可见 而不仅仅是隐藏 中的一个 =17=] !
当然,您必须确保 Panels
具有唯一且文件名符合 Names
..
更新:现在我知道你有 Controls
inside Panel
而不仅仅是图形你画画,也许 BackgroundImage
,我能理解你遇到的问题..
不幸的是 TabPages
隐藏嵌入式控件的方式很糟糕。
所以我写了一个小助手例程,它不会导致主窗体不活动并返回的闪烁..:[=34=]
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
的 independent ..!
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
上,否则它会闪烁;在那种情况下,原来的例程就可以了..
我有一个包含四个选项卡的 TabControl,每个选项卡都包含一个面板。 我想一键保存所有面板,但我只能保存前面的面板
有人知道其他方法吗?
Bitmap eins = new Bitmap(p1.Width, p1.Height);
eins.Save(".string."+1+".jpg",System.Drawing.Imaging.ImageFormat.Jpeg);
我没看到你在 Bitmap
.
这应该适用于所有 Panels
,无论他们在哪个 TabPage
:
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
实际上 不可见 而不仅仅是隐藏 中的一个 =17=] !
当然,您必须确保 Panels
具有唯一且文件名符合 Names
..
更新:现在我知道你有 Controls
inside Panel
而不仅仅是图形你画画,也许 BackgroundImage
,我能理解你遇到的问题..
不幸的是 TabPages
隐藏嵌入式控件的方式很糟糕。
所以我写了一个小助手例程,它不会导致主窗体不活动并返回的闪烁..:[=34=]
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
的 independent ..!
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
上,否则它会闪烁;在那种情况下,原来的例程就可以了..