c#将图像(缩放)绘制到图形,不进行正确插值.修复?

Nic*_*ick 4 c# graphics interpolation gdi+ stretch

我的图像宽1px,有些高度.我需要在它的OnPaint事件的控件的整个宽度上绘制这个图像.我得到它绘制,但不正确.看起来当它伸展它时,它实际上并没有填满所有像素.好像插值是关闭的.有没有办法说"停止聪明,只是画出来"?我在图形对象的选项中看不到InterpolationMode.Off或.None.

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

Nic*_*ick 10

好的,我想出了神奇的关键词:

g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
Run Code Online (Sandbox Code Playgroud)

这与将插值模式设置为NearestNeighbour相结合,可以绘制完整的块.

如果不设置插值模式,您会得到奇怪的混合(预期).在不设置PixelOffsetMode的情况下,最近邻居算法没有邻居可以在空白颜料上进行比较,因此只绘制了一半的图像,宽度的一半.将其设置为偏移一半,将所有内容移动-0.5px,并允许此算法用于块纹理.

  • 我遇到了同样的问题,在尝试了PixelOffsetMode和InterpolationMode的几种变体后,这对我有用.对于那些通过Google搜索的人:将PixelOffsetMode设置为Half可让graphics.DrawImage(...)调整图像大小(如在MS Paint中),不会出现任何锯齿,并使用您指定的内容填充目标大小/矩形.如果你想要在不关心瑕疵/混合的情况下覆盖单个彩色图像/图案,这是很好的(因为它的一种纯色,不会有任何颜色). (2认同)