2011-12-08 41 views
1

我有一个通过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照片查看器中打开它们,并尝试从那里打印它们。经过调整大小的图像会像我在c#应用程序中那样模糊地打印,但原始图像打印效果非常好;无论采用哪种算法,Windows照片查看器用于调整大小到单个页面都不会导致图像变模糊。

我想知道,Windows照片查看器可以在调整打印大小时增加像素密度吗?也许这就是为什么在代码中调整它使其变得模糊的原因;原始像素密度不足以清楚地显示按比例缩小的图像。

+0

http://www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-saving-cropping-and-resizing –

+0

您是否尝试过在e.Graphics上设置插值方法? I.e:e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; – Cheesebaron

+0

@ Cheesebaron:我尝试过。它似乎没有太大的区别。 – jjoelson

回答

0

它看起来并不像是保存宽高比。您需要计算原始图像的宽度与高度的比率,并确保缩放输出图像,使其尺寸具有相同的比例。

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

编辑
检查graphics.dpiX和.DpiY proeprties,看看你的打印机具有不同的DPI从垂直水平去。如果它们不同,则必须对尺寸进行一些额外的调整。

+0

我提到宽度始终是限制尺寸,所以我相信上面的代码在长宽比方面是正确的。 – jjoelson

+1

您的打印机可能每个维度都有不同的DPI吗?检查graphics.DpiX和.DpiY属性,如果它们不同,则可能需要应用一些额外的补偿。 –

+0

分辨率在每个维度都是相同的。 – jjoelson