gpt4 book ai didi

c# - 为什么 Graphics.DrawImage 裁剪了我图像的一部分?

转载 作者:太空狗 更新时间:2023-10-29 17:46:43 25 4
gpt4 key购买 nike

如果您考虑下图,它是一个相当基本的图标,大小为 32x32。图标周围是一个透明的矩形,虽然我在测试时用纯色填充了四个角。

Source Image

现在考虑这段代码,它只是简单地绘制图像,但比例更大:

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);
}

请注意,我正在绘制完整图像,我并没有试图以任何方式裁剪它,只是放大了它。

最后,这是测试给我的输出:

Painted example

注意到问题了吗?顶行和左列中的一半像素已经消失。如果我然后尝试在其上覆盖一个网格,它看起来非常糟糕,因为网格正确对齐,但图像不是。即使只是将大小加倍到 64,64 也会引入第一行/列裁剪。

请注意,我还尝试偏移目标矩形以防它在 0,0 之前绘制,但事实并非如此。

我也尝试过使用不同的插值模式,但据我所知,通过令人头疼的模糊,像素仍然被裁剪了,所以我不认为这是由于插值模式造成的。

我也尝试过使用不同的图形模式,但除了它似乎没有帮助之外,我还是需要坚持使用像素。

出于好奇,我再次尝试使用 96dpi 的新图像副本并获得相同的效果,所以我认为这不是源图像的分辨率。

捕获吸管并使用 Rectangle 而不是 RectangleF 也没有效果。

谁能提供任何线索来说明为什么会出现这种明显的收割现象?

谢谢;

最佳答案

PixelOffsetMode默认设置为 PixelOffsetMode.Half:

Specifies that pixels are offset by -.5 units, both horizontally and vertically, for high speed antialiasing.

在您的情况下,原始图像中的半个像素是结果图像中的 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);
}

关于c# - 为什么 Graphics.DrawImage 裁剪了我图像的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14070311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com