2011-07-02 58 views
3

嗨,我是在內存中從畫布使用PngBitmapEncoder創建圖像。RenderTargetBitmap是模糊的

public void CaptureGraphic() 
{ 
    Canvas canvas = new Canvas(); 
    canvas.SnapsToDevicePixels = true; 
    canvas.Height = IMAGEHEIGHT; 
    canvas.Width = IMAGEWIDTH; 
    Draw(canvas); 
    canvas.Arrange(new Rect(0, 0, IMAGEWIDTH, IMAGEHEIGHT)); 
    member.MemberImage = GetPngFromUIElement(canvas); 
} 

public static System.Drawing.Image GetPngFromUIElement(Canvas source) 
{ 
    int width = (int)source.ActualWidth; 
    int height = (int)source.ActualHeight; 

    if (width == 0) 
     width = (int)source.Width; 
    if (height == 0) 
     height = (int)source.Height; 


    RenderTargetBitmap bitmap = new RenderTargetBitmap(width, height, 96d, 96d, PixelFormats.Pbgra32); 
    bitmap.Render(source); 

    PngBitmapEncoder enc = new PngBitmapEncoder(); 
    enc.Interlace = PngInterlaceOption.Off; 
    enc.Frames.Add(BitmapFrame.Create(bitmap)); 

    System.IO.MemoryStream ms = new System.IO.MemoryStream(); 
    enc.Save(ms); 

    System.Drawing.Image image = System.Drawing.Image.FromStream(ms); 

    ms.Flush(); 
    ms.Dispose(); 

    return image; 
} 

然後我發送圖像到打印機使用GDI + DrawImage()方法。但是打印結果模糊。

我試圖原始畫布大小匹配到印刷大小,以避免任何縮放,同樣我試圖使原來相當更大,所以縮放後的圖像保持了質量然而最終打印圖像總是模糊。

任何人都可以提出任何建議/替代品。我已經安裝了相當多的GDI +打印程序,並且轉移到wpf文件不是一種選擇。

謝謝

+0

我想你可以通過添加更多標籤的問題幫助你的自我。 – radbyx

回答

0

您正在捕獲96 DPI的位圖。不要在RenderTargetBitmap的構造函數中使用96,請嘗試匹配打印機輸出的DPI。或者,您可以進行數學計算並計算寬度/高度的差異,並相應地重新縮放報告上的圖像(結果是報告上的圖像將顯得更小)。

+0

謝謝雅各布,是的,我到了那裏。我曾嘗試在構造函數中增加dpi,但是這會切斷圖像,我必須增加圖像大小以及dpi,然後按照您的說法縮小報告中的圖像。現在唯一的問題是,一切都放慢了速度。 –

0

我有同樣的問題。爲了避免模糊的文本和線條,我必須在X和Y方向上以0.5的偏移量繪製所有內容。 E.g,一個水平線可能是

drawingContext.DrawLine(pen, new Point(10.5,10.5), new Point(100.5,10.5)); 

以我爲例,我是渲染到RenderTargetBitmap在不同的線程來提高性能的用戶界面。經渲染的位圖然後被冷凍並繪製到使用

drawingContext.DrawImage(bitmap, new Rect(0.5, 0, bitmap.Width, bitmap.Height)); 

這裏UI,我需要額外的0.5偏移,但(奇怪的)僅在X方向上,從而使呈現的圖像沒有看起來模糊了。