尽管源/目标尺寸相同,但DrawImage仍使图像模糊

时间:2019-05-23 19:59:34

标签: c# .net gdi+ drawimage

我需要将生成的一个小位图复制到一个较大的对象(例如PictureBox),所以我正在使用DrawImage来做到这一点,但是结果重复是模糊的,就像GDI +试图缩放图像一样,除了两个PageUnit都是相同,DPI分辨率相同,源矩形和目标矩形的宽度和高度相同。

如果源和目标X,Y点为0,0,则DrawImage可以正常工作,但是如果我将目标XY位置更改为其他任何值(即使宽度和高度相同),结果也将变得模糊。

我已经尝试了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 +试图缩放图像一样。

1 个答案:

答案 0 :(得分:2)

进一步研究之后,汉斯·帕桑(Hans Passant)是正确的。将Graphics.InterpolationMode设置为NearestNeighbour效果很好。

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

非常感谢您的帮助!