Winforms Print Preview Blurry - PullRequest
       1

Winforms Print Preview Blurry

0 голосов
/ 30 октября 2010

У меня есть предварительный просмотр печати, который отображает захваченную панель в форме '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); 'Они оба размыты в предварительном просмотре.

Я тоже пробовал разные форматы пикселей, без радости.

Я попытался сохранить изображение в формате BMP, JPG, PNG, но без радости (при рисовании изображения из файла).

Я пытался использовать процедуру BitBlt также с теми же результатами.

Tino

Ответы [ 2 ]

0 голосов
/ 25 июня 2013

Я столкнулся с подобной проблемой «размытого шрифта», пытаясь распечатать некоторый пользовательский текст, который я предварительно настроил как Метки в 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);
}

Результирующий текст выглядит намного четче как при предварительном просмотре, так и на фактической печатной странице.

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

0 голосов
/ 30 октября 2010

Это неизбежное следствие разницы между разрешением устройства принтера и монитора. Принтер обычно может печатать с разрешением 600 точек на дюйм. Монитор обычно установлен на 96 DPI. Поэтому, когда вы печатаете на мониторе изображение с четкой бритвой, каждый пиксель изображения требует печати шарика размером 6 x 6. Если не считать создаваемой блочности, все, что нарисовано на экране с помощью сглаживания, получит эти пиксели сглаживания. нарисовано в 6 раз больше. Полностью разрушает эффект. Это особенно заметно для любого текста, нарисованного с помощью сглаживания ClearType. Красные и синие полосы становятся очень заметными на бумаге.

Вы можете частично решить эту проблему, рисуя изображение один на один на принтере, гарантируя, что 1 пиксель в изображении станет 1 пикселем на бумаге. Теперь это должно выглядеть красиво и четко (за исключением проблемы ClearType), но вы будете смотреть на почтовую марку. Увеличение ваших рук в шесть раз дало бы тот же эффект.

Ну, это просто не работает. Используйте класс PrintDocument, чтобы вы могли рисовать вещи на принтере, используя его собственное разрешение. Используйте методы, предоставляемые e.Graphics в обработчике событий PrintPage. Избегайте изображений, если они не являются фотографиями, все, что не имеет мелко детализированных штриховых рисунков, будет хорошо масштабироваться.

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