Скриншот всего экрана и вырез кусков

142
07 августа 2018, 22:00

Как на C# делается скриншот всего рабочего стола.

И как затем вырезать из этого скриншота необходимые куски по координатам x1,y1,x2,y2 ?

На данный момент пока так, но хочется делать 1 скрин, а из него уже куски нарезать.

private Bitmap VirezPicture(int x,int y,int width,int height) // Вырезаем картинку (1)
{
    Rectangle rect = new Rectangle(x, y, width, height);
    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;
}

UPD: Тупанул xD - Можно и так вырезать картинку и затем из 1ой вырезать что угодно.

Answer 1

Есть у меня готовый подобный код (откуда то честно скопипащенный).

Импортируем нужные функции

// P/Invoke declarations
[DllImport("gdi32.dll")]
static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int
wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, CopyPixelOperation rop);
[DllImport("user32.dll")]
static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDc);
[DllImport("gdi32.dll")]
static extern IntPtr DeleteDC(IntPtr hDc);
[DllImport("gdi32.dll")]
static extern IntPtr DeleteObject(IntPtr hDc);
[DllImport("gdi32.dll")]
static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
[DllImport("gdi32.dll")]
static extern IntPtr CreateCompatibleDC(IntPtr hdc);
[DllImport("gdi32.dll")]
static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);
[DllImport("user32.dll")]
public static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll")]
public static extern IntPtr GetWindowDC(IntPtr ptr);

Снятие скрина

Bitmap MakeScreenShot()
{
    var sz = Screen.PrimaryScreen.Bounds.Size;
    IntPtr hDesk = GetDesktopWindow();
    IntPtr hSrce = GetWindowDC(hDesk);
    IntPtr hDest = CreateCompatibleDC(hSrce);
    IntPtr hBmp = CreateCompatibleBitmap(hSrce, sz.Width, sz.Height);
    IntPtr hOldBmp = SelectObject(hDest, hBmp);
    bool b = BitBlt(hDest, 0, 0, sz.Width, sz.Height, hSrce, 0, 0, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt);
    Bitmap bmp = Bitmap.FromHbitmap(hBmp);
    SelectObject(hDest, hOldBmp);
    DeleteObject(hBmp);
    DeleteDC(hDest);
    ReleaseDC(hDesk, hSrce);    
    return bmp;
}

Обрезалочка

Bitmap Crop(Bitmap source, Rectangle crop)
{
    Bitmap target = new Bitmap(crop.Width, crop.Height);
    using (Graphics g = Graphics.FromImage(target))
    {
        g.DrawImage(source, new Rectangle(0, 0, target.Width, target.Height),
                         crop,
                         GraphicsUnit.Pixel);
    }
    return target;
}

Как использовать

var screenshot = MakeScreenShot();
var cropped = Crop(screenshot, new Rectangle(0, 0, 300, 300));

Не забываем, что битмапы хорошо бы диспозить, когда они уже не нужны.

Обращаю внимание, что это скрин главного монитора, а не всего стола. Как сделать скрин всего стола - найти все мониторы, узнать всю ширину\высоту стола, заскринить.

READ ALSO
Трансляция текст из сайта в программу

Трансляция текст из сайта в программу

У меня есть сайт на котором есть text файл к примеру http://сайтcom/text

169
Модификация анонимного типа в рантайме

Модификация анонимного типа в рантайме

В хелпер aspnet я передаю переменную htmlAttributes вида:

171
Чтение файла частями C#

Чтение файла частями C#

Есть файл, пусть будет Scriptps1 powershell

153