Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Graphics.DrawImage裁剪是我图像的一部分? 如果你考虑下面的图像,它是一个相当基本的图标,大小为32×32。图标周围是一个透明的矩形,尽管我在测试时用纯色填充了四个角_C#_Graphics_Gdi+_Drawimage - Fatal编程技术网

C# 为什么Graphics.DrawImage裁剪是我图像的一部分? 如果你考虑下面的图像,它是一个相当基本的图标,大小为32×32。图标周围是一个透明的矩形,尽管我在测试时用纯色填充了四个角

C# 为什么Graphics.DrawImage裁剪是我图像的一部分? 如果你考虑下面的图像,它是一个相当基本的图标,大小为32×32。图标周围是一个透明的矩形,尽管我在测试时用纯色填充了四个角,c#,graphics,gdi+,drawimage,C#,Graphics,Gdi+,Drawimage,现在考虑这个代码,它简单地绘制图像,但在更大的范围内: 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, 51

现在考虑这个代码,它简单地绘制图像,但在更大的范围内:

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的新图像副本,得到了相同的效果,因此我认为这不是源图像的分辨率

抓着吸管,用
矩形
代替
矩形
也没有效果

有人能提供任何线索来解释为什么会出现这种明显的作物吗

谢谢,

默认情况下设置为
PixelOffsetMode.Half

指定像素在水平和垂直方向上偏移-0.5个单位 垂直方向,用于高速抗锯齿

在您的情况下,原始图像中的半个像素是结果图像中的8个像素,这正是您缺少的

尝试将其设置为PixelOffsetMode。无
PixelOffsetMode。高质量

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

刚刚回复了用户确认的回复,我自己尝试了一下,问题用
PixelOffsetMode解决了。高质量
而不是
none

c#

我的案例C++管理:

e->graphics->PixelOffsetMode = System::Drawing::Drawing2D::PixelOffsetMode::HighQuality;

Rotem,谢谢你的回答-我不知道这个特殊的属性。我试过了,但还是不行。但是,我发现如果我将其设置为高质量,那么我的图像就可以正确渲染。听起来像是一个愚蠢的默认值,但很容易修复,如果你知道-再次感谢!我也有同样的问题。也不知道
PixelOffsetMode
属性。同样,
PixelOffsetMode.None
对我来说不起作用,尽管是明显的设置,但是
PixelOffsetMode.HighQuality
确实起作用。实际上,默认值是将其移动半个像素,但这与枚举中的
half
不对应。事实上,将其设置为
Half
可以将该行为减少半个像素,从而解决问题。我相信在实践中,
high-quality
Half
具有相同的效果。
e->graphics->PixelOffsetMode = System::Drawing::Drawing2D::PixelOffsetMode::HighQuality;