C # Печать формы - изображение размыто - PullRequest
3 голосов
/ 01 октября 2009

Я хотел бы напечатать свою форму, но напечатанное изображение очень размыто. На самом деле это настолько размыто, что я не могу прочитать это.

Сначала я фиксирую свою форму:

  [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 голосов
/ 01 октября 2009

Я не знаю, полностью ли это решит вашу проблему, но вы должны использовать InterpolationMode. HighQualityBicubic вместо InterpolationMode.HighQualityBilinear.

Кроме того, намного более простой способ получить растровое изображение из вашей формы - просто использовать метод DrawToBitmap формы.

1 голос
/ 01 октября 2009

Прежде чем просматривать ваш код, один вопрос: какой размер и качество исходного изображения вы пытаетесь напечатать? Каков размер исходного изображения и какой размер вы масштабируете при печати? Можете ли вы опубликовать ссылку на одно из таких изображений? Как новый пользователь, вы ограничены одной ссылкой / вопросом, но этого должно быть достаточно. Имейте в виду, что ваш садовый принтер имеет разрешение экрана примерно в сто раз . Чем больше вы увеличиваете изображение, тем больше и «размытее» становится каждый пиксель. Маленькое или слегка размытое изображение на экране будет выглядеть ужасно при печати и увеличении масштаба.

Сто раз: разрешение экрана обычно составляет от 96 до 120 точек / дюйм. Хороший принтер от 600 до 1200 точек на дюйм. 10 х с каждой стороны = примерно в 100 раз больше разрешения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...