DrawImage Drawing Неправильно для масштабированного изображения - PullRequest
0 голосов
/ 04 февраля 2019

Я снимаю экран рабочего стола и рисую на картинке.

Ниже приведен пример кода для тестирования. В основном я обновляю небольшую часть изображений на картинке, идущей из сокета.так что для повышения производительности я не делаю недействительным целое изображение всегда, вместо того, чтобы просто сделать недействительной область, которую нужно перекрасить с учетом масштабирования.

При событии рисования, используя перегрузку DrawImage ниже, чтобы нарисовать только определенную область графического блока

если вы попытаетесь запустить приведенный ниже код, он не будет отрисован должным образом. Result Screen

Текстовые области не читаются. Что-то не так, я делаю здесь.решение.Вот мой код.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        private Bitmap initial = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                               Screen.PrimaryScreen.Bounds.Height,
                               PixelFormat.Format32bppArgb);
        private Rectangle GetViewRect() { return pictureBox1.ClientRectangle; }

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            initial = CaptureDesktop();
            Rectangle imageRect = new Rectangle(0, 0, initial.Width, initial.Height);

            var viewRect = GetViewRect();
            var scaleX = (float)viewRect.Width / initial.Width;
            var scaleY = (float)viewRect.Height / initial.Height;
            // Make sure the target rectangle includes the new block
            var targetRect = Rectangle.FromLTRB(
                (int)Math.Truncate(imageRect.X * scaleX),
                (int)Math.Truncate(imageRect.Y * scaleY),
                (int)Math.Ceiling(imageRect.Right * scaleX),
                (int)Math.Ceiling(imageRect.Bottom * scaleY));
            pictureBox1.Invalidate(targetRect);
            pictureBox1.Update();




        }


        private Bitmap CaptureDesktop()
        {
            var bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                               Screen.PrimaryScreen.Bounds.Height,
                               PixelFormat.Format32bppArgb);

            // Create a graphics object from the bitmap.
            var gfxScreenshot = Graphics.FromImage(bmpScreenshot);

            // Take the screenshot from the upper left corner to the right bottom corner.
            gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,
                                        Screen.PrimaryScreen.Bounds.Y,
                                        0,
                                        0,
                                        Screen.PrimaryScreen.Bounds.Size,
                                        CopyPixelOperation.SourceCopy);

            return bmpScreenshot;

        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            lock (initial)
            {
                e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
                e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
                e.Graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
                e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;


                var viewRect = GetViewRect();
                var scaleX = (float)initial.Width / viewRect.Width;
                var scaleY = (float)initial.Height / viewRect.Height;
                var targetRect = e.ClipRectangle;
                var imageRect = new RectangleF(targetRect.X * scaleX, targetRect.Y * scaleY, targetRect.Width * scaleX, targetRect.Height * scaleY);
                e.Graphics.DrawImage(initial, targetRect, imageRect, GraphicsUnit.Pixel);
            }

        }
    }
}
`

Редактировать: если я изменю код ниже.работает нормально.

    e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
   e.Graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
   e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High

;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...