我需要将生成的一个小位图复制到一个较大的对象(例如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 +试图缩放图像一样。
答案 0 :(得分:2)
进一步研究之后,汉斯·帕桑(Hans Passant)是正确的。将Graphics.InterpolationMode设置为NearestNeighbour效果很好。
仅当您的PageUnit不是Pixels时,才会出现此问题。我的小脑袋认为这是一个逻辑错误,因为源矩形和目标矩形的宽度和高度都完全相同。唯一不同的是目标位置X和Y。应该不会发生失真。
非常感谢您的帮助!