2013-04-14 20 views
6

Czy ktoś wie, jak zrobić zrzut ekranu przy użyciu C# i ograniczyć go, aby zrobić zdjęcie konkretnego pojemnika/części aplikacji. Nie chcę całego ekranu lub całego okna aplikacji.C# Weź ScreenShot kontroli .net w aplikacji i dołącz do Outlooka E-mail

Mój panel nazywa się po prostu: panel1 Użytkownik kliknie "przycisk" i zrobi zrzut ekranu panelu 1 i dołączy do wiadomości e-mail.

Chciałbym zrobić zrzut ekranu tylko tej sekcji, a następnie zapisać lokalnie na C: \ Drive i/lub dołączyć lub osadzić w wiadomości e-mail programu Outlook.

Czytałem różne inne rzeczy w Internecie, ale większość z nich musiała radzić sobie z tworzeniem złożonych zmian w zrobieniu zrzutu ekranu kontrolki przeglądarki internetowej, której nie szukam.

+0

możliwe duplikat [C#: Jak zrobić zrzut ekranu z części ekranu] (http://stackoverflow.com/questions/3306600/c- jak zrobić zrzut ekranu z części ekranu) – MoonKnight

Odpowiedz

5

zrobić to za pomocą czegoś takiego

public static void TakeCroppedScreenShot(
    string fileName, int x, int y, int width, int height, ImageFormat format) 
{ 
    Rectangle r = new Rectangle(x, y, width, height); 
    Bitmap bmp = new Bitmap(r.Width, r.Height, PixelFormat.Format32bppArgb); 
    Graphics g = Graphics.FromImage(bmp); 
    g.CopyFromScreen(r.Left, r.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy); 
    bmp.Save(fileName, format); 
} 

mam nadzieję, że to pomaga

+0

Właściwie to już jest pytanie: http://stackoverflow.com/questions/3306600/c-how-to-take -a-screenshot-of-a-part-of-screen – MoonKnight

4

Jeśli chcesz tylko do Panel's zrzucie ekranu, można użyć wbudowanej DrawToBitmap metody.

Bitmap bmp = new Bitmap(myPanel.Width, myPanel.Height); 
myPanel.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height)); 
bmp.Save(@"C:\MyPanelImage.bmp"); 

Wystarczy pamiętać, że niektóre elementy sterujące mogą nie działać z tej funkcjonalności, takich jak WebBrowser i RichTextBox kontroli, ale to powinno działać na większości innych kontroli (pole tekstowe, etykiety itp ..)

+0

Dziękuję, Te 2 linie były kluczem tego, czego mi brakowało. Bitmapa bmp = nowa bitmapa (myPanel.Width, myPanel.Height); myPanel.DrawToBitmap (bmp, nowy prostokąt (0, 0, bmp.Width, bmp.Height)); – brink668

+0

To odpowiada na pierwszą połowę pytania o zrobienie zrzutu ekranu. ** Następnie ** perspektywy i takie tam. Ale i tak byłem tu przy pierwszej części. – Bitterblue

1

Znalazłem ten zapisać kontrolę jako bitmapy:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 
    private void Button1_Click(object sender, EventArgs e) 
    { 
     SaveAsBitmap(panel1,"C:\\path\\to\\your\\outputfile.bmp"); 
    } 

    public void SaveAsBitmap(Control control, string fileName) 
    { 
     //get the instance of the graphics from the control 
     Graphics g = control.CreateGraphics(); 

     //new bitmap object to save the image 
     Bitmap bmp = new Bitmap(control.Width, control.Height); 

     //Drawing control to the bitmap 
     control.DrawToBitmap(bmp, new Rectangle(0, 0, control.Width, control.Height)); 

     bmp.Save(fileName); 
     bmp.Dispose(); 

    } 
} 

ja znalazłem coś na temat perspektyw here, ale nie mogłem go przetestować, bo nie mam Outlook zainstalowany na moim komputerze.

2

niewielką modyfikację Killercam's answer:

public static Bitmap takeComponentScreenShot(Control control) 
    { 
     // find absolute position of the control in the screen. 
     Control ctrl = control; 
     Rectangle rect = new Rectangle(Point.Empty, ctrl.Size); 
     do 
     { 
      rect.Offset(ctrl.Location); 
      ctrl = ctrl.Parent; 
     } 
     while (ctrl != null); 

     Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb); 
     Graphics g = Graphics.FromImage(bmp); 

     g.CopyFromScreen(rect.Left, rect.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy); 

     return bmp; 
    } 

Metoda ta ma ekranu natychmiast. Na przykład, jeśli zmienisz widoczność przycisku w panelu tuż przed wywołaniem tej funkcji, mapa bitowa będzie zawierać przycisk. Jeśli nie jest to pożądane, użyj keyboardP's answer.

2

Ulepszenie Asif's odpowiedź:

public static Bitmap takeComponentScreenShot(Control control) 
{ 
    // find absolute position of the control in the screen. 
    Rectangle rect=control.RectangleToScreen(control.Bounds); 

    Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb); 
    Graphics g = Graphics.FromImage(bmp); 

    g.CopyFromScreen(rect.Left, rect.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy); 

    return bmp; 
} 
+0

Jak to ulepszenie? – beresfordt

+0

Druga logika do obliczenia prostokąta czasami się nie udaje –

+0

Dlaczego druga się nie powiedzie i to działa? Takie rzeczy są przydatne do uwzględnienia w odpowiedziach! – beresfordt