如何屏幕捕获并将像素插值为“nearestneighbor”?

时间:2018-06-13 03:38:37

标签: vb.net

我正在创建一个工具,用于捕获鼠标周围的部分屏幕并将其捕获到主窗体上的图片框中。鼠标光标被第二种形式(Form4)包围,该形式跟随光标并使其在所述形式上居中。 Form4上的光标正下方是一个图片框,其背景颜色设置为Lime,因为Lime是Form4的透明度键。这是为了让图片框看到。它后面的屏幕图片框中的区域是捕获的内容。 当这种情况发生时,我会在主窗体(Form1)上的另一个图片框中显示实时屏幕捕获。该图片框还有一个“像素网格”,使用Paint事件在其上呈现。一切正常。但问题是当我尝试将像素内插到“nearestneighbor”时,Form1上图片框的左上角显示正常,但随着它向下和向右,像素开始拉伸一点并重叠像素网格。我甚至做了一个图像,将鼠标悬停在上面进行测试。图像是仅有2种颜色的方格图案,每个检查器仅为1x1像素。这是我的代码,这里是一些发生的截图。谢谢!

        Dim pic As New Bitmap(Form4.PictureBox2.Width, Form4.PictureBox2.Height)

        Dim gfx As Graphics = Graphics.FromImage(pic)
        gfx.CopyFromScreen(New Point(Form4.Location.X + Form4.PictureBox2.Location.X, Form4.Location.Y + Form4.PictureBox2.Location.Y), New Point(0, 0), pic.Size)

        Dim bmpnew As New Bitmap(pic, 258, 258)
        Using g As Graphics = Graphics.FromImage(bmpnew)
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor
            g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half
            g.DrawImage(pic, 0, 0, bmpnew.Width, bmpnew.Height)
        End Using

        PictureBox2.BackgroundImage = bmpnew

enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

几天后,我终于弄清楚出了什么问题。 主表单上的图片框是一定的大小,Form4上的图片框也是如此。基本上,我正在使用Form4上的图片框区域的屏幕截图并将其调整到更大的比例,然后将该位图放入主窗体上的图片框中,然后插值当然,等等等等等等。我刚想通了什么是因为像素在调整大小时会拉伸,对于宽度和高度都不是一个完美的高档,所以像素实际上是被拉伸的。在进行屏幕保护的Form4上的图片框,它是42x42,但主表格上的图片框是258x258。它必须是可分割的。换句话说,屏幕大小必须乘以一个数字,比如说4.主体上的图片框应该等于那个。 以下是固定代码。

        Dim pic As New Bitmap(Form4.PictureBox2.Width, Form4.PictureBox2.Height)

        Dim gfx As Graphics = Graphics.FromImage(pic)
        gfx.CopyFromScreen(New Point(Form4.Location.X + Form4.PictureBox2.Location.X, Form4.Location.Y + Form4.PictureBox2.Location.Y), New Point(0, 0), pic.Size)

        Dim bmpnew As New Bitmap(pic, 252, 252)
        Using g As Graphics = Graphics.FromImage(bmpnew)
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor
            g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half
            g.DrawImage(pic, 0, 0, 252, 252) <<the correct size
        End Using

        PictureBox2.BackgroundImage = bmpnew

我甚至将主窗体上的图片框大小更改为252x252。它现在有效。不管怎么说,还是要谢谢你。我希望这可以帮助别人。 下面是现在的样子。这就是我想要实现的目标。

enter image description here

As you can see, now the pixels are lining up with the grid as intended. No more going beyond the bounds.

相关问题