C#绘制缩放图像到图形中,插值不正确。有解决方法吗?

5
我有一张宽度为1像素,高度不确定的图片。我需要在OnPaint事件中将这张图片绘制在整个控件上。我成功地将其绘制出来了,但是效果并不正确。似乎在拉伸时,并没有填充所有的像素。好像插值出了问题。是否有一种方法可以让它停止智能化,只是简单地绘制呢?在图形对象的选项中,我看不到InterpolationMode.Off或.None。
我可以通过使用宽度为X的图像(其中X与控件的宽度相同)来确认我实际上正在绘制整个宽度。然后当它绘制时,就像平常一样覆盖整个区域。但是,这个控件一直在调整大小,为了节省内存和其他方面的考虑,在Web世界中使用宽度为1像素的图像非常普遍。但是这是用于桌面C#应用程序的。您有什么解决方法吗?
2个回答

13

好的,我找到了关键字:

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

将插值模式设置为NearestNeighbor,再加上这个方法可以绘制完整的图块。

如果不设置插值模式,则会出现奇怪的混合效果(预期)。如果不设置PixelOffsetMode,则最近邻算法在空白绘画中没有相邻的对比对象,因此仅绘制图像的一半宽度。将其设置为偏移量的一半,将所有内容向左平移-0.5px,并允许该算法适用于块纹理。


3
我遇到了同样的问题,尝试了几种PixelOffsetMode和InterpolationMode的变化后,这是对我有效的解决方法。对于那些通过Google搜索的人:将PixelOffsetMode设置为Half可以让graphics.DrawImage(...)调整图像大小(就像在MS Paint中),不会出现任何锯齿,并使用您指定的内容填充目标大小/矩形。如果您想要叠加一个单色图像/图案,而不关心伪影/混合(因为它是一个纯色,所以不会有任何影响),这很好用。 - Andrew

0

在这种情况下,你需要使用InterpolationMode.NearestNeighbor。


我已经尝试过这个,它给了我一个实心位图,恰好是宽度的1/2,然后什么也没有。其他模式在一半后会产生不同程度的透明度,但InterpolationMode.NearestNeighbor只绘制了0.5 *所需宽度。 - Nick
那不是真的,问题一定在你代码的其他地方。我为了确认测试了它。插值模式与绘制图像的宽度无关。 - Ed S.
只有在没有其他绘制时才会这样。请查看下面的答案,它与PixelOffset有关。这很容易重现。取任何控件,覆盖其OnPaint事件,为整个宽度绘制一个1像素宽的图像,它只会显示50%的宽度。现在设置PixelOffset,它就会显示100%。这是在Visual Studio 2010和.NET 4.0上,在许多不同的控件上都表现相同。 - Nick
我已经测试过了,没有看到那种行为。 - Ed S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接