如果你考虑下面的图像,它是一个相当基本的图标,大小为32x32。图标周围是一个透明的矩形,虽然我在测试时用纯色填充了四个角落。
现在考虑一下这个代码,它只是绘制图像,但规模更大:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor;
e.Graphics.DrawImage(Properties.Resources.icon_32a, new RectangleF(0, 0, 512, 512), new RectangleF(0, 0, 32, 32), GraphicsUnit.Pixel);
}
请注意,我正在绘制完整的图像,我并不是试图以任何方式裁剪它,只需将其放大。
最后,这是测试给我的输出:
注意问题?顶行和左列中的一半像素消失了。如果我然后尝试在此顶部覆盖一个网格,它看起来非常糟糕,因为网格正确对齐,但图像不是。即使只是将大小加倍到64,64引入了第一行/列裁剪。
注意,我也试过偏移目标矩形,以防它在0,0之前绘制,但事实并非如此。
我也试过使用不同的插值模式,但据我所知,由于头痛引起模糊,像素仍被裁剪,所以我不相信这是由于插值模式。
我也尝试使用不同的图形模式,但除了它似乎没有帮助之外,我还是需要坚持使用像素。
我出于好奇心再次尝试使用96dpi的新图像副本并获得相同的效果,因此我认为这不是源图像的分辨率。
抓住稻草并使用Rectangle
代替RectangleF
也没有效果。
任何人都能提供有关为什么会出现这种明显作物的线索吗?
感谢;
答案 0 :(得分:8)
PixelOffsetMode
默认设置为PixelOffsetMode.Half
:
指定像素在水平方向上偏移-.5个单位 垂直,用于高速抗锯齿。
在你的情况下,原始图像中的半个像素在结果图像中是8个像素,这正是你所缺少的。
尝试将其设置为 PixelOffsetMode.None
PixelOffsetMode.HighQuality
:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor;
e.Graphics.DrawImage(Properties.Resources.icon_32a, new RectangleF(0, 0, 512, 512), new RectangleF(0, 0, 32, 32), GraphicsUnit.Pixel);
}
答案 1 :(得分:3)
只是覆盖用户确认的回复,我自己尝试了,问题已经通过PixelOffsetMode.HighQuality
而不是none
来解决。
C#
e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
我的案例c ++ managed:
e->graphics->PixelOffsetMode = System::Drawing::Drawing2D::PixelOffsetMode::HighQuality;