2013-04-14 7 views
6

Qualcuno sa come fare uno screenshot usando C# e limitarlo per scattare una foto di un contenitore specifico/porzione di un'applicazione. Non voglio l'intero schermo o l'intera finestra dell'applicazione.C# Prendi ScreenShot del controllo .net all'interno dell'applicazione e allega Outlook Email

Il mio pannello è chiamato semplicemente: pannello1 L'utente farebbe clic su un "pulsante" e catturerà l'immagine di panel1 e allegherà all'e-mail.

Vorrei fare solo uno screenshot di quella sezione e quindi salvare localmente in C: \ Drive e/o allegare o incorporare in un email di Outlook.

Ho letto altre cose su Internet ma la maggior parte di loro ha dovuto occuparsi della creazione di modifiche complesse in uno screenshot di un controllo del browser Web che non sto cercando.

+0

possibile duplicato del [C#: come prendere uno screenshot di una porzione di schermo] (http://stackoverflow.com/questions/3306600/c- come prendere uno screenshot di una porzione di schermo) – MoonKnight

risposta

5

lo faccio usando qualcosa come

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); 
} 

Spero che questo aiuta

+0

In realtà, c'è già una domanda con questo: http://stackoverflow.com/questions/3306600/c-how-to-take -a-screenshot-of-a-part-of-screen – MoonKnight

4

Se si desidera solo per il Panel's screenshot, è possibile utilizzare il built-in DrawToBitmap metodo.

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

Basta notare che alcuni controlli potrebbero non funzionare con questa funzionalità, come le WebBrowser e RichTextBox controlli ma dovrebbe funzionare per la maggior parte degli altri controlli (testo, etichette ecc ..)

+0

Grazie, queste 2 righe erano la chiave di ciò che mi mancava. Bitmap bmp = nuovo Bitmap (myPanel.Width, myPanel.Height); myPanel.DrawToBitmap (bmp, new Rectangle (0, 0, bmp.Width, bmp.Height)); – brink668

+0

Questo risponde alla prima metà della domanda di creazione di uno screenshot. ** Poi ** outlook e cose del genere. Ma ero comunque qui per la prima parte. – Bitterblue

1

ho trovato questo per salvare un controllo come bitmap:

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(); 

    } 
} 

ho trovato qualcosa su Outlook here, ma non ho potuto testare, perché non ho prospettive installato sul mio PC.

2

leggera modifica 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; 
    } 

questo metodo la schermata immediatamente. Ad esempio, se si modifica la visibilità di un pulsante all'interno del pannello appena prima di chiamare questa funzione, la bitmap conterrà il pulsante. Se ciò non è desiderato, utilizzare keyboardP's answer.

2

Un miglioramento a Asif's risposta:

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

Come è un miglioramento? – beresfordt

+0

L'altra logica per calcolare il rettangolo alcune volte non riesce –

+0

Perché l'altro non funziona e questo funziona? Cose come questa sono utili per includere nelle risposte! – beresfordt