@HPositron

Как получить полный снимок экрана на C#?

Моя программа делает снимок экрана и сохраняет его на диске.
Вот код создания снимка:
Bitmap printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics graphics = Graphics.FromImage(printscreen as Image);
graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size);
printscreen.Save("D:\\1.jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);
Мой монитор имеет разрешение 1920x1080, но в качестве скриншота сохраняется его левый верхний фрагмент размером 1536x864.
Как сделать скриншот в правильном разрешении?
  • Вопрос задан
  • 315 просмотров
Решения вопроса 1
firedragon
@firedragon
Senior .NET developer
Что то мне подсказывает что у вас фактор умножения 1,25

[DllImport("gdi32.dll")]
static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
public enum DeviceCap
{
    VERTRES = 10,
    DESKTOPVERTRES = 117,

    // http://pinvoke.net/default.aspx/gdi32/GetDeviceCaps.html
}  


private float getScalingFactor()
{
    Graphics g = Graphics.FromHwnd(IntPtr.Zero);
    IntPtr desktop = g.GetHdc();
    int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES);
    int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES); 

    float ScreenScalingFactor = (float)PhysicalScreenHeight / (float)LogicalScreenHeight;

    return ScreenScalingFactor; // 1.25 = 125%
}


#region License

// // Разработано: Коротенко Владимиром Николаевичем (Vladimir N. Korotenko)
// // email: koroten@ya.ru
// // skype:vladimir-korotenko
// // https://vkorotenko.ru
// // Создано:   09:11:2020 14:45

#endregion

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Kvn.ScreenShooter
{
    public class ScreenShooter
    {
        [DllImport("gdi32.dll")]
        private static extern int GetDeviceCaps(IntPtr hdc, int nIndex);

        private enum DeviceCap
        {
            // ReSharper disable once InconsistentNaming
            VERTRES = 10,

            // ReSharper disable once InconsistentNaming
            DESKTOPVERTRES = 117,
            // http://pinvoke.net/default.aspx/gdi32/GetDeviceCaps.html
        }


        private static float GetScalingFactor()
        {
            using (var g = Graphics.FromHwnd(IntPtr.Zero))
            {
                var desktop = g.GetHdc();
                var logicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES);
                var physicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES);
                var scalingFactor = (float)physicalScreenHeight / (float)logicalScreenHeight;
                return scalingFactor; // 1.25 = 125%
            }

        }

        /// <summary>
        /// Получение скриншота с фактором увеличения у экрана
        /// </summary>
        /// <param name="path">Путь для сохранения файла</param>
        /// <param name="format">Формат сохраняемого файла</param>
        /// <param name="quality">Quality of jpeg</param>
        public static void TakeScreenShoot(string path, ImageFormat format, long quality = 75L)
        {
            var sc = GetScalingFactor();
            var width = (int)(SystemInformation.VirtualScreen.Width * sc);
            var height = (int)(SystemInformation.VirtualScreen.Height * sc);

            using (var shoot = new Bitmap(width, height))
            using (var graphics = Graphics.FromImage(shoot))
            {
                graphics.CopyFromScreen(0, 0, 0, 0, shoot.Size);
                if (path.ToLowerInvariant().EndsWith(".jpg") || path.ToLowerInvariant().EndsWith(".jpeg"))
                {
                    var jpgEncoder = GetEncoder(ImageFormat.Jpeg);
                    var myEncoder = System.Drawing.Imaging.Encoder.Quality;
                    var encParameters = new EncoderParameters(1);
                    var myEncoderParameter = new EncoderParameter(myEncoder, quality);
                    encParameters.Param[0] = myEncoderParameter;
                    shoot.Save(path, jpgEncoder, encParameters);
                    return;
                }
                shoot.Save(path, format);
            }
        }
        private static ImageCodecInfo GetEncoder(ImageFormat format)
        {
            return ImageCodecInfo.GetImageDecoders().FirstOrDefault(codec => codec.FormatID == format.Guid);
        }
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы