Winforms打印预览模糊

时间:2010-10-30 12:47:05

标签: winforms

我有一个打印预览,在窗体'Panel1.DrawToBitmap(memoryImage,bounds)上显示捕获的面板;'

我还将图像保存到我的硬盘 - 'memoryImage.Save(“diary.png”)'

任何缩放级别的打印预览中的图像都很模糊,保存的图像非常完美(在Windows照片查看器和PS中查看)。

我喜欢打印预览与保存的图像一样好,有什么想法吗?

这是代码: -

    private void CaptureScreen()
    {
        int x = splitContainerDiary.Location.X;
        int y = splitContainerDiary.Location.Y;

        int SCwidth = splitContainerDiary.Panel1.Width;
        int SCheight = splitContainerDiary.Panel1.Height;

        Rectangle bounds = new Rectangle(x, y, SCwidth, SCheight);

        memoryImage = new Bitmap(SCwidth, SCheight, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        splitContainerDiary.Panel1.DrawToBitmap(memoryImage, bounds);
        memoryImage.Save("diary.png");
    }

    private void printDocumentDiary_PrintPage(object sender, PrintPageEventArgs e)
    {
        CaptureScreen();
        Font HeaderFont = new Font("Consolas", 16, FontStyle.Bold);
        e.Graphics.DrawString(selectedYear.ToString() + " - " + name, HeaderFont, Brushes.Black, 15, 15);
        e.Graphics.DrawImage(Image.FromFile("diary.png"), 5, 5);
     //   e.Graphics.DrawImage(memoryImage, 0, 40);
        PrintDoodle(e);
    }

我试图从内存中绘制图像(e.Graphics.DrawImage(memoryImage,0,40)以及保存的图像'e.Graphics.DrawImage(Image.FromFile(“diary.png”)),5 ,5);'它们在打印预览中都很模糊。

我尝试了不同的Pixel格式,也没有任何乐趣。

我尝试将图像保存为BMP,JPG,PNG,但也没有任何喜悦(从图片中提取图像时)。

我尝试过使用BitBlt例程同样的结果。

蒂诺

2 个答案:

答案 0 :(得分:0)

这是打印机设备分辨率与显示器之间巨大差异的必然结果。打印机通常可以以每英寸600点的分辨率打印。监视器通常设置为96 DPI。因此,当您在显示器上打印出锐利的图像时,图像的每个像素都需要打印6 x 6的斑点。与产生的块效果相比,屏幕上绘制的具有抗锯齿功能的任何内容都将获得这些抗锯齿像素也是大6倍。完全毁了效果。对于使用ClearType消除锯齿绘制的任何文本,这一点尤其明显。红色和蓝色条纹在纸上变得非常明显。

您可以通过在打印机上一对一地绘制图像来部分解决此问题,确保图像中的1个像素在纸张上变为1个像素。现在应该看起来很漂亮(减去ClearType问题)但你会看一张邮票。将手臂长出六倍会产生同样的效果。

嗯,这个效果不好。使用PrintDocument类,以便您可以使用其原始分辨率将内容绘制到打印机。在PrintPage事件处理程序中使用e.Graphics提供的方法。避免使用图像,除非它们是照片,任何没有细节艺术线条的图像都可以很好地缩放。

答案 1 :(得分:0)

我遇到过类似的"模糊字体"问题,同时尝试打印出一些自定义文本,我已在TableLayoutPanel中预先安排为标签。

我对模糊性的解决方案如下:我创建了一个面板,标签的大小是所需最终尺寸的四倍(使用字体44而不是11,使用宽度和高度的四倍)。

然后我创建了一个(大)位图,并在最后一步缩小了它(DrawImage):

using (var bmp = new Bitmap(tableLayout.Width, tableLayout.Height))
{
    tableLayout.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
    printPageEventArgs.Graphics.DrawImage(
        bmp, 
        printPageEventArgs.MarginBounds.X, 
        printPageEventArgs.MarginBounds.Y, 
        bmp.Width / 4, 
        bmp.Height / 4);
}

在预览和实际打印页面中,生成的文本看起来更清晰。

当然,这种方法只有在您可以操纵控件的大小时才能工作,例如通过创建它"屏幕外#34;。但如果您需要打印实际显示的控件,它将无法工作。