DrawImage绘图对于缩放图像不正确

时间:2019-02-04 06:58:10

标签: c# image

我正在捕获桌面屏幕并在图片框上绘图。

以下是用于测试的示例代码。基本上,我正在更新图片框上来自插座的一小部分图像。因此,出于性能方面的考虑,我并不总是使整个图像无效,而不仅仅是使需要缩放以进行缩放的区域无效。

在绘制事件中,使用下面的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

;

0 个答案:

没有答案