2011-05-14 4 views
2

패널을 모두 JPG에 저장하려고합니다. 이미 질문했지만 대답은 없었습니다. 문제는 패널에 스크롤 바 (모든 요소에 대해 충분한 공간이 아님)가 있지만 패널의 맨 아래에 보이는 요소 만 표시한다는 것입니다.C# 스크롤 가능한 패널을 모두 이미지로 저장합니다.

public void DrawControl(Control control,Bitmap bitmap) 
{ 
    control.DrawToBitmap(bitmap,control.Bounds); 
    foreach (Control childControl in control.Controls) 
    { 
     DrawControl(childControl,bitmap); 
    } 
} 

public void SaveBitmap() 
{ 
    Bitmap bmp = new Bitmap(this.panel1.Width, this.panel.Height); 

    this.panel.DrawToBitmap(bmp, new Rectangle(0, 0, this.panel.Width, this.panel.Height)); 
    foreach (Control control in panel1.Controls) 
    { 
     DrawControl(control, bmp); 
    } 

    bmp.Save("d:\\panel.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); 
} 

답변

1

비트 맵이 너무 작아서 panel.DisplayRectangle만큼 크게 만듭니다. 이미지에 스크롤바를 가져 오지 않으려면 패널을 그리지 마십시오.

0

스크롤 된 각 패널의 내용을 비트 맵으로 가져온 다음 비트 맵 부분을 병합 할 수 있습니까?

public void SaveBitmap(System.Windows.Forms.Panel CtrlToSave, string fileName) 
    { 
     Point oldPosition = new Point(this.HorizontalScroll.Value, this.VerticalScroll.Value); 

     CtrlToSave.PerformLayout(); 

     ComposedImage ci = new ComposedImage(new Size(CtrlToSave.DisplayRectangle.Width, CtrlToSave.DisplayRectangle.Height)); 

     int visibleWidth = CtrlToSave.Width - (CtrlToSave.VerticalScroll.Visible ? SystemInformation.VerticalScrollBarWidth : 0); 
     int visibleHeightBuffer = CtrlToSave.Height - (CtrlToSave.HorizontalScroll.Visible ? SystemInformation.HorizontalScrollBarHeight : 0); 

     //int Iteration = 0; 

     for (int x = CtrlToSave.DisplayRectangle.Width-visibleWidth; x >= 0 ; x -= visibleWidth) 
     {    

      int visibleHeight = visibleHeightBuffer; 

      for (int y = CtrlToSave.DisplayRectangle.Height-visibleHeight; y >= 0 ; y -= visibleHeight) 
      { 
       CtrlToSave.HorizontalScroll.Value = x; 
       CtrlToSave.VerticalScroll.Value = y; 

       CtrlToSave.PerformLayout(); 

       Bitmap bmp = new Bitmap(visibleWidth, visibleHeight); 

       CtrlToSave.DrawToBitmap(bmp, new Rectangle(0, 0, visibleWidth, visibleHeight)); 
       ci.images.Add(new ImagePart(new Point(x,y),bmp)); 

       ///Show image parts 
       //using (Graphics grD = Graphics.FromImage(bmp)) 
       //{ 
       // Iteration++; 
       // grD.DrawRectangle(Pens.Blue,new Rectangle(0,0,bmp.Width-1,bmp.Height-1)); 
        //grD.DrawString("x:"+x+",y:"+y+",W:"+visibleWidth+",H:"+visibleHeight + " I:" + Iteration,new Font("Segoe UI",9f),Brushes.Red,new Point(2,2));       
       //} 

       if (y - visibleHeight < (CtrlToSave.DisplayRectangle.Height % visibleHeight)) 
        visibleHeight = CtrlToSave.DisplayRectangle.Height % visibleHeight; 

       if (visibleHeight == 0) 
        break; 
      } 

      if (x - visibleWidth < (CtrlToSave.DisplayRectangle.Width % visibleWidth)) 
       visibleWidth = CtrlToSave.DisplayRectangle.Width % visibleWidth;     
      if (visibleWidth == 0) 
       break; 
     } 

     Bitmap img = ci.composeImage(); 
     img.Save(fileName, System.Drawing.Imaging.ImageFormat.Png); 

     CtrlToSave.HorizontalScroll.Value = oldPosition.X; 
     CtrlToSave.VerticalScroll.Value = oldPosition.Y; 
    } 



public class ComposedImage 
{ 
    public Size dimensions; 
    public List<ImagePart> images; 

    public ComposedImage(Size dimensions) 
    { 
     this.dimensions = dimensions; 
     this.images = new List<ImagePart>(); 
    } 

    public ComposedImage(Size dimensions, List<ImagePart> images) 
    { 
     this.dimensions = dimensions; 
     this.images = images; 
    } 

    public Bitmap composeImage() 
    { 
     if (dimensions == null || images == null) 
      return null; 

     Bitmap fullbmp = new Bitmap(dimensions.Width, dimensions.Height); 
     using (Graphics grD = Graphics.FromImage(fullbmp)) 
     { 
      foreach (ImagePart bmp in images) 
      { 
       grD.DrawImage(bmp.image, bmp.location.X, bmp.location.Y); 
      } 
     } 
     return fullbmp; 
    } 
} 

public class ImagePart 
{ 
    public Point location; 
    public Bitmap image; 

    public ImagePart(Point location, Bitmap image) 
    { 
     this.location = location; 
     this.image = image; 
    } 
} 
0

나는 이것이 오래된 스레드라는 것을 알았지 만, 단일 패널의 내용을 이미지로 저장하는 훨씬 간단한 방법을 발견했습니다. 이 방법은 단일 패널에서 작동하며, 현재이 보고서를 사용하여 1560 x 6043으로 내 보고서를 인쇄합니다.

private void button2_Click(object sender, EventArgs e) 
{ 

    panel1.AutoSize = true; 
    panel1.Refresh(); 

    using (Bitmap bmp = new Bitmap(panel1.Width, panel1.Height)) 
    { 

     panel1.DrawToBitmap(bmp, new Rectangle(Point.Empty, bmp.Size)); 
     string fileName = "Full_Domain_Report_" + DateTime.Now.ToString("yyyy-MM-dd_HH_mm_ss") + ".png";  
     bmp.Save(@"C:\temp\" + fileName, ImageFormat.Png); // make sure path exists! 

    } 

    panel1.AutoSize = false; 
    panel1.Refresh(); 
} 
관련 문제