2011-12-08 40 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