6 Stimmen

Einen Teil eines Bildschirms erfassen

Ich verwende die win32 PrintWindow-Funktion, um einen Bildschirm in ein BitMap-Objekt zu erfassen.

Wie kann ich das Bild im Speicher zuschneiden, wenn ich nur einen Teil des Fensters erfassen möchte?

Hier ist der Code, den ich verwende, um das gesamte Fenster zu erfassen:

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

3voto

George Johnston Punkte 30756

Sie könnten einfach den gesamten Bildschirm erfassen und das Bild dann an eine Zuschneidefunktion übergeben, die einen Bereich des gesamten Bildes auswählt. Schauen Sie sich die Methode Bitmap.Clone() an. z.B.

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

Hinweis: Ich habe dies von dieser Blog

3voto

kirk.burleson Punkte 1181

Hier ist der vollständige Code, um den Bildschirm zu erfassen und ein beschnittenes Bild von 100 Pixel im Quadrat zu erstellen. Der Code stammt aus dem Click-Ereignis einer Schaltfläche. Verwenden Sie, was Sie brauchen.

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

0voto

kprobst Punkte 15455

Sparen Sie sich die Mühe und holen Sie sich die Quelle zu Cropper .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X