C# winforms图形与最近邻过滤裁剪图像边缘

C# winforms图形与最近邻过滤裁剪图像边缘,c#,winforms,graphics,bitmap,C#,Winforms,Graphics,Bitmap,我正在写一个芯片8模拟器/解释器。一切都很顺利。在这一点上,我需要一个用户界面来玩一些游戏和观看这个坏杰克逊的动作。我首先遇到了一个问题,在屏幕上绘制帧缓冲区(只是一个位图)非常模糊。在确定需要将插值模式设置为“最近邻”后,它看起来好多了,但似乎图像的边缘被剪裁了,或者我误解了插值的作用。这是一个截图 在顶部、左侧和右侧看到的边缘应以与您看到的图案保持一致的“整体”白色像素结束。特别容易看到左上角的问题,应该是一个完整的白色像素 放大的图像是64x32,并且是使用普通图形对象绘制的,例如:(忽

我正在写一个芯片8模拟器/解释器。一切都很顺利。在这一点上,我需要一个用户界面来玩一些游戏和观看这个坏杰克逊的动作。我首先遇到了一个问题,在屏幕上绘制帧缓冲区(只是一个位图)非常模糊。在确定需要将插值模式设置为“最近邻”后,它看起来好多了,但似乎图像的边缘被剪裁了,或者我误解了插值的作用。这是一个截图

在顶部、左侧和右侧看到的边缘应以与您看到的图案保持一致的“整体”白色像素结束。特别容易看到左上角的问题,应该是一个完整的白色像素

放大的图像是64x32,并且是使用普通图形对象绘制的,例如:(忽略64*6,我知道这很有趣)

其中“cpu.raster”是模拟器渲染游戏的位图。我会发布代码的其余部分,但看起来都很标准。与图形相关的唯一其他代码是插值/平滑模式,其设置如下:

        g = this.CreateGraphics ();
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
        this.DoubleBuffered = true;

是否有其他设置我应该知道,以防止这种情况?我尝试缩小绘制图像的大小,认为表单可能以某种方式对其进行了剪裁,但事实并非如此,图像在屏幕截图中看到的边缘处结束。

在设置
插值模式
平滑模式
的代码中,添加以下行:

g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;

这将修复您正在绘制的内容的顶部和左侧。至于右侧,请确保您的表单足够宽,以容纳图像。您指定的宽度为64*6=384,但在屏幕截图中,您的表单显示区域为377像素。

这为我做到了,非常感谢。我的表单设置为384宽,但它看起来好像包括边框/挡板?点0,0位于窗体区域的左上角,但看起来像素384实际上在边框/挡板中处于“屏幕外”。将表单放大一点后,一切都井然有序。@ALLCAPS您想设置
ClientSize
而不是
Size
。遗憾的是,它在设计器中不可用,即使它实际上是在设计器生成的代码中使用的。你也可以考虑制作一个自己的<代码>控件来处理绘图——没有恼人的<代码> clieStase处理:(更不用说你可以使用<代码> OnPaint < /代码>和<代码>无效> <代码>来处理绘图,而不是使用<代码> CureTrimeActudio<代码>强制绘制。
g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;