【问题标题】:Silverlight printing anti-aliasingSilverlight 打印抗锯齿
【发布时间】:2011-12-10 02:00:03
【问题描述】:

我正在尝试从 Silverlight 4 应用程序打印图像(QR 码),但是打印时图像被抗锯齿(我已尝试过 XPS 文件打印机和硬件打印机)图像模糊,条码阅读器无法读取.

Image from printed XPS document http://img805.imageshack.us/img805/7677/qraliasing.png

我正在使用这个简单的代码来打印它:

WriteableBitmap bitmap = new WriteableBitmap(width, height);
//write bitmap pixels
Image image = new Image(){Stretch = Stretch.None};
image.Source = bitmap;
image.Width = bitmap.PixelWidth;
image.Height = bitmap.PixelHeight;
//Print
PrintDocument printDocument = new PrintDocument();
printDocument.PrintPage += (sender, args) =>
{
    args.PageVisual = image;
};
printDocument.Print("QrCode");

【问题讨论】:

    标签: c# silverlight


    【解决方案1】:

    您是否尝试更改图形对象的平滑模式?

    WriteableBitmap bitmap = new WriteableBitmap(width, height);
    //write bitmap pixels
    Image image = new Image(){Stretch = Stretch.None};
    image.Source = bitmap;
    image.Width = bitmap.PixelWidth;
    image.Height = bitmap.PixelHeight;
    //Print
    PrintDocument printDocument = new PrintDocument();
    printDocument.PrintPage += (sender, args) =>
    {
        //**Add this**
        args.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
    
        args.PageVisual = image;
    };
    printDocument.Print("QrCode");
    

    【讨论】:

    • 没有 args.Graphics 属性。 System.Drawing.Drawing2D.SmoothingMode 在 Silverlight 中不可用。
    • 如果您尝试在此处使用 None 属性? 10rem.net/blog/2010/05/01/…我不知道这是否相关。只是想提供帮助。
    • System.Drawing.Drawing2D.SmoothingMode 在 Silverlight 中不可用。您提供的链接与 WPF 有关。
    【解决方案2】:

    我找到了解决办法。

    在 Silverlight 4 中打印图像控件时,它向打印机发送的不是图像控件的“打印屏幕”,就像它在您的 UserControl 中看起来那样,而是在它的源属性中设置的图像。如果您生成两个分辨率为 100x100 px 和 1000x1000px 的位图,并将它们放在 100x100px 大小的 Image 控件中,打印结果将与您预期的不同。

    所以解决方案是生成高分辨率图像(或高档图像)并将其放入所需大小的图像控件中。

    【讨论】:

      【解决方案3】:

      在我打字的时候,你似乎找到了一个解决方案,但我还是会提交......

      发生这种情况的原因是,PrintDocument 本质上将采用 UIElement(您的图像),它通常会显示为 96 DPI 的屏幕,并将其放大到适合打印的 600 DPI。由于无法告诉这个高档操作如何处理平滑,所以你得到的是丑陋的模糊。

      但是,如果您自己进行放大 blit,然后将相反的 RenderTransform 应用于图像,当 PrintDocument 放大图像时,您的高分辨率 blit 将是结果。

      一旦您获得了 QR 码的高分辨率 blit(基本上是正常的 600 / 96 = 6.25 倍),您就可以应用比例变换,将其缩小完全相同的数量:

      image.RenderTransform = new ScaleTransform { 
          ScaleX = 96.0 / 600.0, 
          ScaleY = 96.0 / 600.0
      };
      

      当您打印时,您应该会看到锋利的边缘。

      【讨论】:

        猜你喜欢
        • 2014-02-18
        • 1970-01-01
        • 2016-06-28
        • 2011-07-05
        • 2014-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多