缩放和打印Bitmap对象

时间:2011-12-08 22:59:57

标签: c# winforms printing bitmap scaling

我有一个通过DrawToBitmap方法绘制几个控件创建的Bitmap对象。我现在想要打印位图。但是,位图太大而无法放在单个页面上,因此必须按比例缩小。我正在尝试使用以下DrawImage重载:

public void PrintPageHandler(object sender, PrintPageEventArgs e)
{
    Bitmap bitmap = GetBitmap();
    Rectangle destRect = new Rectangle(
        e.MarginBounds.X,
        e.MarginBounds.Y,
        e.MarginBounds.Width,
        e.MarginBounds.Width * bitmap.Height / bitmap.Width);
    e.Graphics.DrawImage(
                     bitmap,
                     destRect,
                     0,
                     0,
                     bitmap.Width,
                     bitmap.Height,
                     System.Drawing.GraphicsUnit.Pixel);
}

请注意,destRect的宽度和高度是这样构造的,因为位图比它高得多(即宽度始终是限制尺寸)。

我的问题是图像在打印时会变得非常模糊。我错误地缩放了吗?我感觉e.MarginBounds和图像尺寸之间的GraphicsUnit不匹配可能存在一些问题。任何帮助将不胜感激。

[UPDATE]

我尝试使用下面评论中给出的方法调整位图大小,但图像仍然打印模糊。为了测试,我将原始和调整大小的位图保存到文件,在Windows Photo Viewer中打开它们,并尝试从那里打印它们。调整大小的图像打印模糊,就像在我的c#应用程序中一样,但原始图像打印得很漂亮;无论Windows Photo Viewer用于调整大小到单个页面的算法都不会导致图像模糊。

我想知道,Windows Photo Viewer在调整大小以进行打印时会增加像素密度吗?也许这就是为什么在代码中调整它会导致它变得模糊;原点像素密度不足以清楚地显示缩小的图像。

1 个答案:

答案 0 :(得分:0)

看起来你没有保留纵横比。您需要计算原始图像的宽高比,并确保缩放输出图像,使其尺寸具有相同的比例。

基本上:
1 - 计算纵横比 2 - 找到目标尺寸的最大尺寸 3 - 调整输出大小以使最大尺寸匹配,并将较小尺寸设置为较大尺寸乘以比率。

修改
检查graphics.dpiX和.DpiY proeprties以查看您的打印机是否具有从垂直方向水平移动的不同DPI。如果它们不同,则必须对尺寸进行一些额外调整。