【问题标题】: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);

【问题讨论】:

    标签: c# bitmap save panel tabcontrol


    【解决方案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>..
    猜你喜欢
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2019-02-06
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    相关资源
    最近更新 更多