2010-12-10 88 views
4

我有一个图像是1px宽,和一些高度。我需要在它的OnPaint事件的整个控件宽度上绘制这个图像。我得到它,但不正确。它看起来像延伸它时,它并不实际填充所有像素。就好像插值关闭一样。有没有办法说“停止聪明,只是已经画出来”?我在图形对象的选项中看不到InterpolationMode.Off或.None。c#绘制图像(缩放)为图形,不能正确插值。修复?

我可以确认我实际上使用宽度为X的图像来绘制全宽,其中X与控件的宽度相同。然后当它画,它正常覆盖整个区域。然而,这个控件一直在调整大小,并且为了节省内存,所有使用1px宽图像的爵士乐在网络世界中是非常正常的。这是用于桌面C#应用程序。有想法该怎么解决这个吗?

回答

9

确定我想出magic关键字:

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

这再加上的内插模式设定为NearestNeighbour允许要绘制一个完整块。

没有设置插值模式,会出现奇怪的混合(预期)。 没有设置PixelOffsetMode,最近邻居算法没有邻居要在空白画面上进行比较,因此只绘制一半图像的宽度的一半。将其设置为偏移一半,将所有内容移动-0.5px,并允许此算法适用于块纹理。

+2

我有同样的问题,并尝试PixelOffsetMode和InterpolationMode的几个变种后,这是对我有用。 对于那些通过Google进行搜索:将PixelOffsetMode设置为Half,可以让graphics.DrawImage(...)调整图像大小(如在MS Paint中)而不会出现任何别名,并用您指定的内容填充目标大小/矩形。 如果您不想关注工件/混合(因为它的一个纯色,不会有任何),所以如果要覆盖单个彩色图像/图案,这很好。 – Andrew 2011-05-29 04:55:54

0

InterpolationMode.NearestNeighbor是你想要在这种情况下使用。

+0

我已经试过这个,它给了我一个确切的1/2的宽度的位图,然后什么都没有。其他模式在半途中给出不同的透明度,但InterpolationMode.NearestNeighbor只绘制0.5 * wanted_width。 – Nick 2010-12-10 20:55:11

+0

这不是真的,它必须是代码中其他地方的问题。我自己测试它只是为了确保。插值模式与绘制图像的宽度无关。 – 2010-12-10 21:14:06

+0

当没有别的东西被绘制时,它会执行。检查下面的答案,它也与PixelOffset有关。它很容易重现。采取任何控制措施,覆盖其OnPaint事件,为全宽度绘制1px宽的图像,并且仅显示50%的宽度。现在设置PixelOffset,它显示100%。这与许多不同控件上的Visual Studio 2010和.NET 4.0一样,都是相同的。 – Nick 2010-12-13 18:05:24