RenderTargetBitmap模糊不清

3

您好,我正在使用PngBitmapEncoder从Canvas中创建内存中的图像。

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文档。谢谢。

我认为你可以通过给问题添加更多的标签来帮助自己。 - radbyx
4个回答

1

我也遇到了同样模糊的结果,并想出了以下代码片段,它采用相同的偏移思路,但使用DrawingVisual的Offset属性(因为我正在使用DrawDrawing,它没有带有偏移参数的重载):

public static Image ToBitmap(Image source)
{
    var dv = new DrawingVisual();
    // Blur workaround
    dv.Offset = new Vector(0.5, 0.5);
    using (var dc = dv.RenderOpen())
        dc.DrawDrawing(((DrawingImage)source.Source).Drawing);

    var bmp = new RenderTargetBitmap((int)source.Width, (int)source.Height, 96, 96, PixelFormats.Pbgra32);
    bmp.Render(dv);

    var bitMapImage = new Image();
    bitMapImage.Source = bmp;
    bitMapImage.Width = source.Width;
    bitMapImage.Height = source.Height;

    return bitMapImage;
}

1

您正在以96 DPI捕获位图。不要在RenderTargetBitmap的构造函数中使用96,而是尝试匹配打印机输出的DPI。或者,您可以进行计算并计算宽度/高度的差异,并相应地在报告上重新调整图像的比例(结果是报告上的图像将显示更小)。


谢谢Jacob,是的,我正在努力。我曾尝试在构造函数中增加dpi,但那会裁剪图像,我不得不增加图像大小和dpi,然后按你所说的在报告中缩小图像。唯一的问题是现在一切都变得非常缓慢。 - Cadair Idris

0

0

我曾经遇到过同样的问题。为了避免文本和线条模糊,我不得不在X和Y方向上都偏移0.5来绘制所有内容。例如,一条水平线可以这样绘制:

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

在我的情况下,我正在不同的线程中渲染到RenderTargetBitmap以提高UI性能。然后将渲染的位图冻结并使用绘制到UI上。
drawingContext.DrawImage(bitmap, new Rect(0.5, 0, bitmap.Width, bitmap.Height));

在这里,我需要一个额外的偏移量0.5,但(奇怪的是)只在X方向上,以便渲染的图像不再看起来模糊。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接