C# 打印表单 - 图像模糊

3

我希望将我的表格打印出来,但是印出来的图像非常模糊。实际上,它非常模糊,以至于我无法阅读它。

首先,我捕捉我的表格:

  [System.Runtime.InteropServices.DllImport("gdi32.dll")]
    private static extern long BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);

    internal void CaptureScreen()
    {
        Application.DoEvents();

        Graphics mygraphics = frm.CreateGraphics();
        Size s = frm.Size;
        memoryImage = new Bitmap(s.Width, s.Height, mygraphics);
        Graphics memoryGraphics = Graphics.FromImage(memoryImage);
        IntPtr dc1 = mygraphics.GetHdc();
        IntPtr dc2 = memoryGraphics.GetHdc();
        BitBlt(dc2, 0, 0, frm.ClientRectangle.Width, frm.ClientRectangle.Height, dc1, 0, 0, 13369376);
        mygraphics.ReleaseHdc(dc1);
        memoryGraphics.ReleaseHdc(dc2);
    }

这里的屏幕图像非常清晰和干净。
这是OnPrintPage方法:
private void OnPrintPage(object sender, PrintPageEventArgs e)
    {
        Bitmap img;
        int width = e.MarginBounds.Width;
        int height = e.MarginBounds.Height;

        if (memoryImage.Size.Width > width || memoryImage.Size.Height > height)
        {
            img = ResizeImage(memoryImage, new Size(width, height));
        }
        else
        {
            img = memoryImage;
        }


        e.Graphics.InterpolationMode = InterpolationMode.HighQualityBilinear;
        e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
        e.Graphics.SmoothingMode = SmoothingMode.HighQuality;

        e.Graphics.DrawImage(img, e.MarginBounds.Top, e.MarginBounds.Left);
    }

调整大小方法:

private static Bitmap ResizeImage(Bitmap imgToResize, Size size)
    {
        int sourceWidth = imgToResize.Width;
        int sourceHeight = imgToResize.Height;

        float nPercent = 0;
        float nPercentW = 0;
        float nPercentH = 0;

        nPercentW = ((float)size.Width / (float)sourceWidth);
        nPercentH = ((float)size.Height / (float)sourceHeight);

        if (nPercentH < nPercentW)
            nPercent = nPercentH;
        else
            nPercent = nPercentW;

        int destWidth = (int)(sourceWidth * nPercent);
        int destHeight = (int)(sourceHeight * nPercent);

        Bitmap b = new Bitmap(destWidth, destHeight);
        Graphics g = Graphics.FromImage((Image)b);
        g.InterpolationMode = InterpolationMode.HighQualityBilinear;
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.PixelOffsetMode = PixelOffsetMode.HighQuality;
        g.CompositingQuality = CompositingQuality.HighQuality;

        g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
        g.Dispose();

        return b;
    }

我知道调整图片大小会使其模糊。但是在打印页面上绘制它会使其更加模糊。

有没有什么技巧可以让图像变得更清晰?我做错了什么吗?

谢谢大家。

2个回答

2

我不确定这是否能完全解决你的问题,但你应该使用InterpolationMode.HighQualityBicubic而不是InterpolationMode.HighQualityBilinear。

此外,从表单中获取位图的更简单方法是直接使用表单的DrawToBitmap方法。


1
在深入研究您的代码之前,有一个问题需要先搞清楚:您要打印的原始图像的大小和质量如何?原始图像的大小是多少?打印时您将其缩放到什么大小?您能否发布一张此类图像的链接?作为新用户,您每个问题只能发布一个链接,但这应该足够了。请记住,普通打印机的分辨率约为屏幕的100倍。您将图像缩放得越大,每个像素就会变得越大和“模糊”。小图像或略微模糊的屏幕图像在打印并放大时看起来会很糟糕。
一百倍:屏幕dpi通常在96到120点/英寸之间。好的打印机是600到1200 dpi。每边放大10倍=大约100倍的分辨率。

以下是編程相關內容的中文翻譯。僅返回翻譯後的文本:這是原始圖像:http://www.shrani.si/f/3A/Ry/4QtO01vR/memoryimage2.png這是打印到PDF的文件:http://www.shrani.si/f/44/Sx/4S3bChOa/document.pdf圖像大小為1032x748,文檔邊界為1089x747。這意味著圖像沒有被調整大小,只是在打印文檔上繪製。因此圖像模糊不清。 - user180439

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接