2010-07-13 12 views
6

Estoy usando la función Win32 PrintWindow para capturar una pantalla en un objeto BitMap.Cómo capturar parte de una pantalla

Si solo quiero capturar una región de la ventana, ¿cómo puedo recortar la imagen en la memoria?

Aquí está el código que estoy usando para capturar toda la ventana:

[System.Runtime.InteropServices.DllImport(strUSER32DLL, CharSet = CharSet.Auto, SetLastError = true)] 
public static extern int PrintWindow(IntPtr hWnd, IntPtr hBltDC, uint iFlags); 

public enum enPrintWindowFlags : uint 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    PW_ALL = 0x00000000, 
    /// <summary> 
    /// Only the client area of the window is copied. By default, the entire window is copied. 
    /// </summary> 
    PW_CLIENTONLY = 0x00000001 
} 

public System.Drawing.Bitmap CaptureWindow(IntPtr hWnd, enPrintWindowFlags eFlags) 
{ 
    System.Drawing.Rectangle rctForm = System.Drawing.Rectangle.Empty; 

    using(System.Drawing.Graphics grfx = System.Drawing.Graphics.FromHdc(GetWindowDC(hWnd))) 
    { 
     rctForm = System.Drawing.Rectangle.Round(grfx.VisibleClipBounds); 
    } 

    System.Drawing.Bitmap pImage = new System.Drawing.Bitmap(rctForm.Width, rctForm.Height); 
    System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(pImage); 

    IntPtr hDC = graphics.GetHdc();   
    //paint control onto graphics using provided options   
    try 
    {    
     PrintWindow(hWnd, hDC, (uint)eFlags);  
    } 
    finally 
    {    
     graphics.ReleaseHdc(hDC);   
    }  
    return pImage; 
} 

Respuesta

3

Usted simplemente puede agarrar toda la pantalla y luego pasar a la imagen en una función de recorte que selecciona una región de la imagen total. Eche un vistazo al método Bitmap.Clone(). p.ej.

public Bitmap CropBitmap(Bitmap bitmap, int cropX, int cropY, int cropWidth, int cropHeight) 
{ 
Rectangle rect = new Rectangle(cropX, cropY, cropWidth, cropHeight); 
Bitmap cropped = bitmap.Clone(rect, bitmap.PixelFormat); 
return cropped; 
} 

Nota, me tiró hacia abajo desde este this blog

+0

Eso es lo que estaba pensando ... puede ser posible obtener solo esa parte, pero esto es mucho más simple. – Adam

3

Aquí está el código completo para capturar la pantalla y crear una imagen recortada de 100 píxeles cuadrados. El código se toma de un botón Click evento. Usa lo que necesitas

Bitmap screenShot = null; 
     Bitmap croppedImage; 
     Graphics screen; 

     if(saveFileDialog.ShowDialog() == DialogResult.OK) 
     { 
      this.Hide(); 
      screenShot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, 
            Screen.PrimaryScreen.Bounds.Height, 
            PixelFormat.Format32bppArgb); 
      screen = Graphics.FromImage(screenShot); 
      screen.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, 
            Screen.PrimaryScreen.Bounds.Y, 
            0, 
            0, 
            Screen.PrimaryScreen.Bounds.Size, 
            CopyPixelOperation.SourceCopy); 
      screenShot.Save(saveFileDialog.FileName, ImageFormat.Png); 
      this.Show(); 
     } 

     //crop image 
     if(screenShot != null) 
     { 
      if(saveFileDialog.ShowDialog() == DialogResult.OK) 
      { 
       int x = 100; 
       int y = 100; 
       int xWidth = 100; 
       int yHeight = 100; 
       Rectangle rect = new Rectangle(x, y, xWidth, yHeight); 
       croppedImage = screenShot.Clone(rect, PixelFormat.Format32bppArgb); 
       if (croppedImage != null) 
       { 
        croppedImage.Save(saveFileDialog.FileName, ImageFormat.Png); 
       }  
      }     
     } 
Cuestiones relacionadas