2011-07-02 28 views
3

こんにちは私は、PngBitmapEncoderを使用してCanvasから画像をメモリに作成しています。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

ありがとうJacob、うん、私はそこに着いている。私はコンストラクタでdpiをインクリメントしようとしましたが、画像を切り取っていました。画像サイズとdpiを増やしてから、レポートの画像を縮小しなければなりませんでした。ただ問題はすべてがすぐに減速したことです。 –

0

私は同じ問題を抱えていました。ぼやけたテキストや線を避けるために、XとYの方向に0.5のオフセットですべてを描画しなければなりませんでした。例えば、水平線は、私の場合は

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

可能性があり、私は、UIのパフォーマンスを改善するために、別のスレッドでRenderTargetBitmapにレンダリングされました。レンダリングされたビットマップはここ

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

を使用して、その後、凍結し、UI上に描かれているレンダリングされた画像は、任意のより多くのぼやけを見ていないように、私は、X方向にのみ(妙)0.5のオフセットを追加する必要はなく、。

関連する問題