Winforms打印预览模糊

Winforms打印预览模糊,winforms,Winforms,我有一个打印预览,在表单“Panel1.DrawToBitmap(memoryImage,bounds);”上显示捕获的面板 我还将图像保存到硬盘上-“memoryImage.save(“diary.png”)” 任何缩放级别的打印预览中的图像都很模糊,保存的图像非常完美(在windows photo viewer&PS中查看) 我希望打印预览和保存的图像一样好,有什么想法吗 代码如下:- private void CaptureScreen() { int x

我有一个打印预览,在表单“Panel1.DrawToBitmap(memoryImage,bounds);”上显示捕获的面板

我还将图像保存到硬盘上-“memoryImage.save(“diary.png”)”

任何缩放级别的打印预览中的图像都很模糊,保存的图像非常完美(在windows photo viewer&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)”中绘制图像;它们在打印预览中都很模糊

我也尝试过不同的像素格式,但没有任何乐趣

我也尝试过将图像保存为BMP、JPG、PNG,但没有任何乐趣(从文件中绘制图像时)

我也尝试过使用BitBlt例程,但效果相同


Tino

这是打印机与显示器的设备分辨率之间存在巨大差异的必然结果。打印机通常可以以每英寸600点的分辨率打印。显示器通常设置为96 DPI。因此,当您在显示器上打印一幅锐利的图像时,图像的每个像素都需要打印一个blob为6 x 6。除了产生的块状外,任何在屏幕上使用抗锯齿绘制的内容都会使这些抗锯齿像素的大小增加6倍。完全破坏效果。使用ClearType抗锯齿绘制的任何文本都会特别明显。红色和蓝色条纹在纸上变得非常明显

你可以通过在打印机上一对一地绘制图像来部分解决这个问题,确保图像中的1个像素变成纸上的1个像素。这应该看起来很漂亮和清晰(减去ClearType问题),但你会看到一张邮票。手臂长六倍也会有同样的效果


好吧,这就是不好用。使用PrintDocument类,这样你就可以使用打印机的本机分辨率绘制东西。使用PrintPage事件处理程序中的e.Graphics提供的方法。避免使用图像,除非它们是照片,否则任何没有细密线条艺术的图像都可以很好地缩放。

我遇到过类似的问题“字体模糊”的问题,在打印一些自定义文本时,我已经在TableLayoutPanel中预先安排为标签

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

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

结果文本在预览和实际打印页面中看起来更清晰


当然,这种方法只有在您可以操纵控件的大小时才能起作用,例如,通过在“屏幕外”创建控件“。但是,如果您要求打印实际显示的控件,则它将不起作用。

Hans感谢您的回答,这不是我所希望的,但我现在明白了。我打印一份12个月的datagidview日记,每个月每天打印一个单元格,因此使用e.graphics绘图方法需要一些工作:-(所以我想我现在还是用蓝侠吧。再次谢谢你,蒂诺
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);
}