【发布时间】: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 的宽度和高度相同。