Как получить часть экрана

Я использую функцию win32 PrintWindow для получения экрана к объекту BitMap.

Если я только хочу получить регион окна, как я могу обрезать изображение в памяти?

Вот код, который я использую для получения всего окна:

[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;
}
6
задан adrianbanks 13 July 2010 в 22:14
поделиться

3 ответа

Вы можете просто захватить весь экран, а затем передать изображение в функцию обрезки, которая выбирает область всего изображения. Посмотрите на метод Bitmap.Clone(). например,

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

Примечание, я взял это из этого блога

3
ответ дан 17 December 2019 в 02:21
поделиться

Вот полный код для захвата экрана и создания кадрированного изображения размером 100 пикселей. Код взят из события нажатия кнопки. Используйте то, что вам нужно.

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);
               }     
            }                   
         }
3
ответ дан 17 December 2019 в 02:21
поделиться

избавьте себя от проблем и подберите исходник к Cropper

0
ответ дан 17 December 2019 в 02:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: