#c# #winforms #printing #printdocument #blurry
#c# #winforms #печать #printdocument #размыто
Вопрос:
Я успешно напечатал форму Windows, но весь текст слегка размыт. Я пришел к выводу, что это результат того, что разрешение экрана намного меньше разрешения, используемого принтером. Есть ли фундаментальный недостаток в моем подходе или есть способ переформатировать текст перед печатью, чтобы он получился четким?
void PrintImage(object o, PrintPageEventArgs e)
{
int x = SystemInformation.WorkingArea.X;
int y = SystemInformation.WorkingArea.Y;
int width = panel1.Width;
int height = panel1.Height;
Rectangle bounds = new Rectangle(x, y, width, height);
Bitmap img = new Bitmap(width, height);
this.DrawToBitmap(img, bounds);
Point p = new Point(100, 100);
e.Graphics.DrawImage(img, p);
}
private void BtnPrint_Click(object sender, EventArgs e)
{
btnPrint.Visible = false;
btnCancel.Visible = false;
if(txtNotes.Text == "Notes:" || txtNotes.Text == "")
{
txtNotes.Visible = false;
}
PrintDocument pd = new PrintDocument();
pd.PrintPage = new PrintPageEventHandler(PrintImage);
pd.Print();
}
Комментарии:
1. Я думаю, вам было бы лучше использовать
DrawString
вместоDrawImage
. Может быть, попробовать тестDrawString
и посмотреть, четкий ли текст?
Ответ №1:
Есть ли фундаментальный недостаток в моем подходе […]?
ДА.
-
Вы берете размер
panel1
для вычисления размера изображения. Позже вы разрешаетеthis
рисовать изображение, ноthis
это форма, а не панель. -
Что заставляет вас думать, что
SystemInformation.WorkingArea
это связано с окном, которое вы хотите распечатать? -
Вам следует немного больше заботиться о одноразовых объектах.
[…] есть ли способ переформатировать текст перед печатью, чтобы он получился четким?
Не существует общего способа, который позволил бы вам также масштабировать все другие элементы управления.
Однако вместо размытого текста вы можете получить четкий пиксельный текст, увеличив растровое изображение на определенный коэффициент с помощью NearestNeighbor
механизма.
Вот разница в PDF, созданном без масштабирования (слева), и в 3 раза больше (справа) при том же уровне масштабирования в Acrobat Reader (нажмите, чтобы увеличить):
Вот код масштабирования, также без устранения каких-либо проблем:
this.DrawToBitmap(img, bounds);
Point p = new Point(100, 100);
img = ResizeBitmap(img, 3);
e.Graphics.DrawImage(img, p);
}
private static Bitmap ResizeBitmap(Bitmap source, int factor)
{
Bitmap result = new Bitmap(source.Width*factor, source.Height*factor);
result.SetResolution(source.HorizontalResolution*factor, source.VerticalResolution*factor);
using (Graphics g = Graphics.FromImage(result))
{
g.InterpolationMode = InterpolationMode.NearestNeighbor;
g.DrawImage(source, 0, 0, source.Width*factor, source.Height*factor);
}
return resu<
}
Комментарии:
1. Отметил это правильно, поскольку это мне очень помогло и отвечает на вопрос. Хотя @BlorgBeard был прав, все это нужно делать с помощью drawstring. Спасибо вам обоим, огромная помощь.
2. @SomeNerdAtWork:
string
в вашем коде вообще нет, что заставило меня подумать, что у вас нетstring
3. Код в моем первоначальном сообщении был полностью переработан, спасибо за ввод.