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

时间:2014-01-20 21:19:59

标签: c# winforms graphics bitmap

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

A screenshot of the issue.  Note the edges.

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

放大的图像是64x32,正在使用普通图形对象绘制,如下所示:(忽略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;

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

1 个答案:

答案 0 :(得分:9)

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

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

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