【问题标题】:DrawImage Blurs Image Despite Same Source/Destination Dimensions尽管源/目标尺寸相同,但 DrawImage 会模糊图像
【发布时间】:2019-05-23 19:59:33
【问题描述】:

我需要将我生成的一个小位图复制到一个更大的对象(比如 PictureBox),所以我使用 DrawImage 来执行此操作,但结果副本很模糊,好像 GDI+ 正在尝试缩放图像,除了两个 PageUnits 都是相同,DPI 分辨率相同,源矩形和目标矩形的宽度和高度相同。

如果源和目标 X,Y 点为 0,0,则 DrawImage 可以完美运行,但如果我将目标 X.Y 位置更改为其他任何值(即使宽度和高度相同),则结果会模糊。

我已经尝试过 DrawImage 的每一个重载,结果总是一样的。除非起点和终点 X、Y 位置相同,否则图像会模糊。

private void DrawStringVerticalStackingV4(string text, Graphics g, SizeF sizeMaxArea, PointF startPoint, Font font, Brush brush, StringFormat sf)
        {
            Bitmap bmp = new Bitmap(100, 10, g);
            Graphics gBmp = Graphics.FromImage(bmp);

            gBmp.PageUnit = g.PageUnit;

            // Some stuff being drawn...

            // Draw the bitmap on the original canvas
            RectangleF destRect = new RectangleF(startPoint.X, startPoint.Y, gBmp.VisibleClipBounds.Width, gBmp.VisibleClipBounds.Height);
            RectangleF srcRect = new RectangleF(0, 0, gBmp.VisibleClipBounds.Width, gBmp.VisibleClipBounds.Height);

            g.DrawImage(bmp, destRect, srcRect, g.PageUnit);

            // Housekeeping
         }

除非 destRect 和 srcRect 具有相同的 X 和 Y,否则结果会略微失真,就好像 GDI+ 正在尝试缩放图像一样。

【问题讨论】:

  • 修补 Graphics.InterpolationMode。当您选择 NearestNeighbor 时,您只会在放大小位图时获得锐利的边缘。 PixelOffsetMode 也可以用于极端放大。
  • 现在是这样:将我生成的小位图复制到更大的对象分辨率相同,源矩形和目标矩形的宽度和高度相同 ??看起来很矛盾。你想看看this demo
  • @TaW 为歧义道歉。目标“画布”是一个较大的对象,但源被绘制的区域与上面的源代码完全相同。 destRect 和 srcRect 的宽度和高度相同。

标签: c# .net gdi+ drawimage


【解决方案1】:

在进一步玩弄这个之后,Hans Passant 是正确的。将 Graphics.InterpolationMode 设置为 NearestNeighbour 效果很好。

仅当您的 PageUnit 不是像素时才会出现此问题。我的小脑袋认为这是一个逻辑错误,因为源矩形和目标矩形具有完全相同的宽度和高度。唯一不同的是目的地 X 和 Y 位置。应该没有失真。

非常感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    相关资源
    最近更新 更多