首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RenderTargetBitmap模糊

RenderTargetBitmap模糊
EN

Stack Overflow用户
提问于 2011-07-03 01:16:03
回答 4查看 5K关注 0票数 3

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

代码语言:javascript
复制
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文档。

谢谢

EN

回答 4

Stack Overflow用户

发布于 2011-07-03 14:09:16

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

票数 1
EN

Stack Overflow用户

发布于 2020-03-12 04:19:39

我得到了同样模糊的结果,并提出了以下代码,它对offset应用了相同的概念,但在DrawingVisual上使用了Offset属性(因为我使用的是DrawDrawing,它没有使用offset参数的重载):

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-07-03 16:10:58

我想我已经找到答案了。

http://www.charlespetzold.com/blog/2007/12/High-Resolution-Printing-of-WPF-3D-Visuals.html

我只需要将图像大小和dpi一起放大,文件大小就大大增加了!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6558457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档