【问题标题】:Printing Windows Form打印 Windows 窗体
【发布时间】:2010-09-16 12:08:34
【问题描述】:

我继承了一些代码来打印表单的内容,但是在纸上生成的图像似乎有某种阴影/模糊,好像它试图做抗锯齿但做得不太好,字母像素化在边缘。

有人知道提高最终质量的方法吗?

System.Drawing.Printing.PrintDocument Doc = new System.Drawing.Printing.PrintDocument();
            Doc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.Doc_PrintPage123);
            Doc.DefaultPageSettings.Landscape = true;
            Doc.DefaultPageSettings.PrinterSettings.DefaultPageSettings.Landscape = true;
            Doc.DefaultPageSettings.PrinterSettings.Copies = 2;
            Doc.PrinterSettings.Copies = 2;
            Doc.Print();

 private void Doc_PrintPage123(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
             Bitmap bitmap = new Bitmap(AForm.Width, AForm.Height);
            AForm.DrawToBitmap(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height));
            e.Graphics.DrawImage(bitmap, 0, 0);
        }

【问题讨论】:

  • “阴影/模糊”?这几乎是最模糊的,并且没有告诉我们您的问题。
  • @joey: 我的更新对你有帮助吗
  • 我对此一无所知。我最后一次尝试打印表单是在 VB 6 中使用 PrintForm 函数。但我强烈怀疑“阴影/模糊”不是那种可以帮助更多了解这一点的人的细节。
  • @joey 是否只是以低分辨率打印?您是否考虑过制作更高分辨率的位图,例如,大约 300dpi
  • @rowland 你如何使它成为更好的分辨率?

标签: c# .net winforms printing


【解决方案1】:

这很正常。打印机的分辨率比显示器好 6 倍。使用默认映射(1 像素 = 0.01 英寸),您将在打印机上获得与屏幕上大小大致相同的位图。屏幕上的 1 个像素在打印机上变成 6 x 6 像素的斑点。是的,看起来不太好。

如果您将其缩小 6 倍,您将获得清晰的图像。比邮票大一点。不要打印表格。通过在 e.Graphics 上绘图来利用打印机分辨率。当然还有很多工作,像 Crystal Reports 这样的报表生成器很受欢迎。

【讨论】:

  • 我同意,但我不能在这种情况下使用 Crystal Reports。
  • 好吧,用 e.Graphics 画画。它看起来很棒,您可以以更适合纸张的格式呈现信息。纵向模式,没有难看的颜色斑点。
【解决方案2】:

表单以其显示的分辨率呈现为位图。模糊和像素化是由于图像具有低分辨率并且您在打印时调整了它的大小。

没有提高质量的好方法。您可以尝试调整图像大小并像 Mamta Dalal 建议的那样应用某种平滑模式,但这只会有助于像素化。

如果您真的需要更高的质量,您必须使用另一种机制来打印您的数据。使用某种报表设计器可能是最简单的方法。

【讨论】:

  • 我的屏幕分辨率是1920x1080,所以分辨率应该没问题吧?不使用 Bitmap 类会更好吗?
  • 正如 Hans 上面所说,您的屏幕分辨率远低于您的打印机分辨率,这就是质量低下的原因。
  • 不使用位图是指使用图像吗?最终会得到相同的结果。如果您想提高质量,您不能使用您现在使用的表单打印方法。
【解决方案3】:

试试这个: e.Graphics.SmoothingMode = SmoothingMode.HighQuality;

【讨论】:

  • 请注意,打印抗锯齿是个坏主意,通常因为抖动会导致效果更差。
【解决方案4】:

您可以提高 Dbi 分辨率。默认为 96

var resultImage = new Bitmap(barcodeImage.Width + 160, barcodeImage.Height + 120);
resultImage.SetResolution(200, 200);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多