从隐藏面板中保存图像/位图
Posted
技术标签:
【中文标题】从隐藏面板中保存图像/位图【英文标题】:Save an Image/Bitmap from hidden panels 【发布时间】:2015-08-16 14:24:28 【问题描述】:我有一个带有四个选项卡的 TabControl,每个选项卡都包含一个面板。 我想一键保存所有面板,但我只能保存前面的面板。
有人知道另一种方法吗?
Bitmap eins = new Bitmap(p1.Width, p1.Height);
eins.Save(".string."+1+".jpg",System.Drawing.Imaging.ImageFormat.Jpeg);
【问题讨论】:
【参考方案1】:我没有看到您在 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
实际上 不可见 而不仅仅是隐藏的TabPages
之一,它甚至会起作用!
当然,您必须确保Panels
具有唯一且符合文件名的Names
..
更新:现在我知道Controls
在里面有Panel
而不仅仅是你绘制的图形,也许还有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
上,否则它会闪烁;在那种情况下,原来的例程就可以了..
【讨论】:
谢谢,我稍后再试试。我也使用了 control.drawtoBitmap() 函数。 效果很好!谢谢。另一个问题:是否可以在不单击每个选项卡的情况下获得所有面板?我必须单击每个选项卡,而不单击面板是黑色的。 那会很奇怪;正如我在答案中所写的那样,我可以毫无问题地从隐藏页面中保存面板。你能解释一下面板包含的内容吗? 面板只包含标签和图表 啊,我不知道。我已经通过解决问题的例程更新了答案。如果您想保存多个面板,您可能需要将其更改为接受List<Control>
..以上是关于从隐藏面板中保存图像/位图的主要内容,如果未能解决你的问题,请参考以下文章