DrawImage调整大小后的图像太小了。

5
当我使用Graphics.DrawImage绘制图像并将其绘制为比原始图像更大的尺寸时,它最终会变得有点太小。您可以在以下图片中看到这一点:
enter image description here 绿色线条不应该可见,也不是图像的一部分。相反,它们被绘制在图像的后面,而图像应该覆盖它们。
如何以完全正确的大小绘制图像?
编辑:我使用与我传递给DrawImage调用的矩形相同的矩形来绘制绿色部分,其尺寸完全符合图像应该有多大的实际尺寸。因此,我的值没有错误(我想)。
编辑2:我使用FillRectangle绘制绿色矩形,因此不需要进行任何笔计算。此外,我记录了我为图像和绿色填充传递的矩形的值,这些值是正确的。只是图像出问题了。由于我此刻不在电脑旁边,所以稍后我会发布代码。
编辑3:这是我用来渲染图像的代码:
// This is for zooming
public readonly float[] SCALES = { 0.05f, 0.1f, 0.125f, 0.25f, 0.333f, 0.5f, 0.667f, 0.75f, 1.0f, 1.25f, 1.5f, 1.75f, 2.0f, 2.5f, 3.0f, 3.5f, 4.0f, 4.5f, 5.0f, 6.0f, 7.0f, 8.0f, 10.0f, 12.0f, 15.0f, 20.0f, 30.0f, 36.0f };
private int scaleIndex = 8;

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    float ScaleFactor = SCALES[scaleIndex];

    e.Graphics.InterpolationMode = ScaleFactor < 1 ? InterpolationMode.Bicubic : InterpolationMode.NearestNeighbor;

    Image im = Properties.Resources.TSprite0;

    for (int y = 0; y < TilesVertical; y++)
    {
        for (int x = 0; x < TilesHorizontal; x++)
        {
            float sx = im.Width * ScaleFactor;
            float sy = im.Height * ScaleFactor;
            Point p = new Point((int)(-scrollPosition.X + sx * x), (int)(-scrollPosition.Y + sy * y));
            Size s = new Size((int)Math.Floor(sx), (int)Math.Floor(sy));

            // The green rectangle in the background should be the same size as the image
            e.Graphics.FillRectangle(Brushes.Lime, new Rectangle(p, s));
            e.Graphics.DrawImage(im, new Rectangle(p, s), 0, 0, 16, 16, GraphicsUnit.Pixel);
        }
    }

    im.Dispose();
}

编辑4:还要注意的是,这个图像似乎被裁剪在左侧和顶部,而不是调整大小。看看这张原始图像在Photoshop中放大后如何呈现,以及GDI+如何呈现: enter image description here


我没有给你的帖子点踩,但我想原因是你没有发布任何代码。如果不能查看你的绘图代码并进行编辑,那么帮助你变得非常困难,这也会影响问题的质量。 - Jacob Lange
@Jimi 我使用 FillRectangle,所以我不使用笔。 - Jonas Kohl
@TaW,你能解释一下你的代码吗?点和位图构造函数内的值是什么意思? - Jonas Kohl
@TaW您是否将图像绘制成比原始图像尺寸更大的尺寸? - Jonas Kohl
我可以确认当缩放因子为2f或更大时出现了问题。偏移量为比例的1/2。 - TaW
我想我找到了原因。让我们删除所有混淆的注释。 - TaW
1个回答

7
问题出现在缩放到2倍或更大时。
看起来整个问题都是由错误的默认PixelOffsetMode引起的。
通过在渲染过程中偏移像素,您可以在渲染速度的代价下提高渲染质量。
将其设置为
g.PixelOffsetMode = PixelOffsetMode.Half;

对我来说它消失了。

将其设置为

g.PixelOffsetMode = PixelOffsetMode.HighQuality;

也可以正常工作。 DefaultNoneHighSpeed 会使图像向左上方略微渲染。
通常您还需要设置 InterpolationMode.NearestNeighbor

这似乎是问题所在!谢谢! - Jonas Kohl
如果将“InterpolationMode”设置为“NearestNeighbor”,我也可以复现它。其他插值模式则不会出现此问题。我想我以前从未注意到过。 - Jimi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接