从隐藏面板中保存图像/位图

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 移动到主Formway to the right 上,因此它不会显示。然后保存并将其移回。当然,您应该检查Panel 是否确实在隐藏的TabPage 上,否则它会闪烁;在那种情况下,原来的例程就可以了..

【讨论】:

谢谢,我稍后再试试。我也使用了 control.drawtoBitmap() 函数。 效果很好!谢谢。另一个问题:是否可以在不单击每个选项卡的情况下获得所有面板?我必须单击每个选项卡,而不单击面板是黑色的。 那会很奇怪;正如我在答案中所写的那样,我可以毫无问题地从隐藏页面中保存面板。你能解释一下面板包含的内容吗? 面板只包含标签和图表 啊,我不知道。我已经通过解决问题的例程更新了答案。如果您想保存多个面板,您可能需要将其更改为接受List<Control>..

以上是关于从隐藏面板中保存图像/位图的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSDocument 时如何隐藏保存面板

将 TPanel 绘制到图像并将其保存在数据集中

C#将所有可滚动面板保存为图像

隐藏或禁用 Crystal Report 参数面板

R:使用magick在1个面板中显示4个png图像

如何将图像从一个面板拖到另一个面板[关闭]