簡體   English   中英

從隱藏的面板保存圖像/位圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM