Silverlight打印抗锯齿

时间:2011-10-18 12:48:48

标签: c# silverlight

我正在尝试从Silverlight 4应用程序打印图像(QR码),但是打印时图像是无污染的(我已尝试过XPS文件打印机和硬件打印机)图像是blury,条形码阅读器无法读取

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");

3 个答案:

答案 0 :(得分:2)

我找到了解决方案。

在Silverlight 4中打印图像控件时,它会向打印机发送图像控件的“打印屏幕”,就像在UserControl中查找但在其源属性中设置图像一样。如果您生成两个100x100像素和1000x1000像素分辨率的位图并将它们放在100x100像素大小的图像控件中,则打印结果将与您预期的不同。

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

答案 1 :(得分:0)

在我打字的时候,你似乎遇到了一个解决方案,但无论如何我都要提交......

发生这种情况的原因是PrintDocument将基本上采用UIElement(您的图像),它通常会闪烁到96 DPI屏幕,并将其升级到适合打印的600 DPI。由于没有办法告诉这个高档操作如何处理平滑,你得到的是那种丑陋的模糊。

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

一旦你获得了QR码的高分辨率(基本上是600/96 =正常情况下的6.25倍),你就应用了一个缩放变换,将它的大小调整为相同的数量:

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

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

答案 2 :(得分:-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");