Как сделать снимок экрана в WPF? Есть код на Windows Forms, нужно перенести на WPF

146
08 февраля 2020, 22:50

У меня есть небольшой участок кода на Winforms ,который я хочу перенести на WPF. Нужно получить картинку своего экрана. Я пытался заменить Bitmap на WriteableBitmap. Но как быть с Graphics и BinaryFormatter?

Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
Graphics gp = Graphics.FromImage(bmp);
gp.CopyFromScreen(0, 0, 0, 0, new Size(bmp.Width, bmp.Height));
BinaryFormatter bFormat = new BinaryFormatter();
bFormat.Serialize(ns, bmp);
gp.Dispose();
bmp.Dispose();
Answer 1

Подключи библиотеки System.Drawing и System.Windows.Forms

using System.Drawing.Imaging;
using System.IO;
using System.Windows.Media.Imaging;
namespace WpfApp1
{
    public static class Screenshot
    {
        /// <summary>
        /// Сделать снимок экрана.
        /// </summary>
        /// <param name="format">Формат, в котором вернуть изображение.</param>
        /// <returns></returns>
        public static BitmapImage CaptureScreen(ImageFormat format)
        {
            System.Drawing.Rectangle rect = new System.Drawing.Rectangle(new System.Drawing.Point(0, 0),
                new System.Drawing.Size(System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width,
                    System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height));
            return CaptureRect(rect, System.Drawing.Imaging.ImageFormat.Png);
        }
        /// <summary>
        /// Сделать снимок определённой области изображения.
        /// </summary>
        /// <param name="rect">Прямоугольник, в котором будет сделан снимок.</param>
        /// <param name="format">Формат изображения.</param>
        /// <returns></returns>
        public static BitmapImage CaptureRect(System.Drawing.Rectangle rect, ImageFormat format)
        {
            using (var ms = new System.IO.MemoryStream())
            {
                using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(rect.Width, rect.Height,
                    System.Drawing.Imaging.PixelFormat.Format32bppRgb))
                {
                    using (System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(bitmap))
                    {
                        graphics.CopyFromScreen(rect.X, rect.Y, 0, 0, rect.Size, System.Drawing.CopyPixelOperation.SourceCopy);
                    }
                    bitmap.Save(ms, format);
                }
                var image = new BitmapImage();
                image.BeginInit();
                image.CacheOption = BitmapCacheOption.OnLoad;
                image.StreamSource = ms;
                image.EndInit();
                return image;
            }
        }
    }
}
READ ALSO
Сворачивание приложения в трей

Сворачивание приложения в трей

Допустим есть программа которая фоном делает определенные операции, не важно какие, допустим каждые 10 секунд собирает информацию по нагрузке...

168
FileStream и расширение длины файла

FileStream и расширение длины файла

Если открывается пустой файл, который не содержит данных, те

173
ObservableCollection связать с listView

ObservableCollection связать с listView

Сначала попробовал сделать так как в инструкции https://docsmicrosoft

148