Как сделать снимок экрана с конкретными координатами экрана пользователя и сохранить его как example.jpeg c #? - PullRequest
0 голосов
/ 28 декабря 2018

Я хочу сделать снимок экрана с верхним левым углом P, шириной w и высотой h, а затем сохранить его.

Я пробовал это. Сделать снимок экрана с указанными координатами .Не работает, или я не знаю, как заставить это работать.

Затем я попытался сохранить буфер обмена, тоже не сработало.

SendKeys.SendWait("%{PRTSC}"); 
Bitmap bp = new Bitmap(Clipboard.GetImage());
bp.Save(@"C:\Users\hasht\spamImages\work.png", ImageFormat.Jpeg);

Я также пытался

private Bitmap bitmap;
private Graphics graph;
... 
graph.CopyFromScreen(new Point(1600, 0), new Point(1920, 0), new Size(320, 300));
Bitmap bp = new Bitmap(320, 300, graph);
bp.Save(@"C:\Users\hasht\spamImages\work.png", ImageFormat.Jpeg);

, но тогда графика была нулевой, поскольку я ее никогда не создавал.Оказывается, вы не можете создать графический объект.Как сделать снимок экрана с верхним левым углом P, шириной w и высотой h, а затем сохранить его?

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Я поместил все в функцию.

/// <summary>
/// Takes a screenshot of the specified section of the screen.
/// </summary>
public void Screenshot(string filename, ImageFormat imageFormat, int width, int height, int sourceX, int sourceY, int destX, int destY)
{
    using (var bm = new Bitmap(width, height))
    {
        using (var gr = Graphics.FromImage(bm))
        {
            gr.CopyFromScreen(sourceX, sourceY, destX, destY, bm.Size);
            bm.Save(filename, imageFormat);
        }
    }
}

Например, для снимка экрана размером 500x500, начиная с верхнего левого угла экрана:

Screenshot(@"c:\temp\test.jpg", ImageFormat.Jpeg, 500, 500, 0, 0, 0, 0);

Может потребоватьсяэто импорт в верхней части вашего класса c #:

using System.Drawing;
using System.Drawing.Imaging;

Графический объект в вашем коде был нулевым, потому что он никогда не инициализировался."Var gr = Graphics.FromImage (bm);"строка - это то, что инициализирует его в моем примере (предоставляя растровое изображение, в которое оно затем будет записывать).

Я использую операторы «using» с растровым изображением и объектом Graphics, потому что необходимо вызвать метод Disposeна них, когда они сделаны (что оператор using будет делать автоматически, даже если есть исключение).

0 голосов
/ 28 декабря 2018

Попробуйте:

    Bitmap printscreen = new Bitmap(150, 150);

    Graphics graphics = Graphics.FromImage(printscreen as Image);

    graphics.CopyFromScreen(Point1, Point2, 0, 0, printscreen.Size);
    printscreen.Save(PATH_FILENAME, ImageFormat.Jpeg);

Отлично работает на кейлоггер проекта

...