C# · 12月 22, 2021

c# – winforms图像与最近邻居过滤图像的剪切边缘

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

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

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

g.DrawImage (cpu.raster,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;

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

解决方法 在您设置InterpolationMode和SmoothingMode的代码中,添加以下行: g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;

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