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