winforms图形与最近邻居过滤图像的剪切边缘

我正在写一个Chip8模拟器/解释器。 它很棒。 到目前为止,我需要一个用户界面来玩一些游戏并观看这个糟糕的jackson。 我首先遇到了一个问题,即在屏幕上绘制帧缓冲区(这只是一个位图)非常模糊。 搞清楚之后我需要将插值模式设置为最近邻,它看起来好多了,但是看起来图像的边缘要么被剪裁,要么我在工作时误解了插值。 这是一个截图。

该问题的屏幕截图。注意边缘。

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

被放大的图像是64×32,并且正在使用普通图形对象绘制,如下所示:(忽略64 * 6,我知道它很有趣)

g.DrawImage (cpu.raster, 0, 0, 64 * 6, 32 * 6); 

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

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

我应该注意另一个设置来防止这种情况吗? 我试着减小绘制图像的大小,想到可能表单是以某种方式剪切它,但事实并非如此,图像结束于您在屏幕截图中看到的边缘。

在您设置InterpolationModeSmoothingMode的代码中,添加以下行:

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

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