Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2021, 15:06   #1
AnPis
Пользователь
 
Регистрация: 02.04.2020
Сообщений: 30
По умолчанию Вывод на печать картинки в точках принтера

Бьюсь над простейшей задачей: распечатать картинку товарного знака в точках принтера, или по крайней мере в заданном масштабе в составе этикетки.
Не могу приспособиться: битмап размером 50х50 точек вылезает размером 500х500.
Где и почему он масштабируется при печати?
Процесс печати:
- назначаю размеры страницы (пробовал в разных единицах, у мелкософта вроде как сотые дюйма).
- обнуляю отступы на странице.
- в событии printDocument1_PrintPage отрисовываю из файла картинку в координатах 0,0.

На принтере установлен размер этикетки 50х35 мм.
Вылезает на этикетку кусок картинки размером раза в три больше заложенного в картинку.
От чего это зависит?
У Graphics есть свойство Scale. Но оно почти не влияет на выводимый масштаб картинки.

Пробовал менять единицы измерения у Graphics с Display на Pixel. Никакого толку.
Есть у кого хороший опыт в этих вещах?
Подскажите правильные действия. Я в C# новичек, в основном на C++ работал, но в Win10 это уже архаизм.
AnPis вне форума Ответить с цитированием
Старый 11.06.2021, 08:17   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

При печати надо выставить параметр страницы в софте. Либо там же параметр чтобы использовал настройку принтера.
Затем в графиксе отмасштабировать вашу картинку.

Код:
 PrintDocument doc = new PrintDocument();
            doc.PrintPage += Doc_PrintPage;

            PrintDialog g = new PrintDialog();
            if (g.ShowDialog() == DialogResult.OK)
            {
                doc.PrinterSettings = g.PrinterSettings;
                doc.DefaultPageSettings = g.PrinterSettings.DefaultPageSettings;
            }
            doc.Print();

private void Doc_PrintPage(object sender, PrintPageEventArgs e)
        {
            e.Graphics.PageUnit = GraphicsUnit.Millimeter;
            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            float pageWidthPix = (float)e.PageBounds.Width /e.PageSettings.PrinterResolution.X;

            e.Graphics.DrawRectangle(Pens.Red, new Rectangle(5,5,40,25)); // используем размер в миллиметрах           
        }

Цитата:
Сообщение от AnPis Посмотреть сообщение
C++ работал, но в Win10 это уже архаизм
Да ну.. Это ваше личное мнение??
Изображения
Тип файла: png p1.png (31.7 Кб, 14 просмотров)
Тип файла: png p2.png (18.1 Кб, 14 просмотров)
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось WorldMaster; 11.06.2021 в 09:22.
WorldMaster вне форума Ответить с цитированием
Старый 15.06.2021, 21:06   #3
AnPis
Пользователь
 
Регистрация: 02.04.2020
Сообщений: 30
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
При печати надо выставить параметр страницы в софте. Либо там же параметр чтобы использовал настройку принтера.
Затем в графиксе отмасштабировать вашу картинку.
Спасибо за практический пример. Я делал почти тоже самое по тем же соображениям: назначал в графиксе единицы принтера, менял параметр scale от 0.2 до 10 и на этикетке размер значка изменялся едва ли на 20%. Это ввергло меня в уныние, ибо я утратил понимание природы вещей.
Буду на работе через неделю - проверю это еще раз на принтере.

Лет 10 назад делал подобное на С++. Повозился со структурами описания параметров принтера в WinApi, но добился желаемого. Сейчас решил сделать то же на шарфике, и уперся, поскольку опыт был давно, и лезть на низкий уровень тут для меня проблематично, да и неправильно.

Цитата:
C++ работал, но в Win10 это уже архаизм
Да ну.. Это ваше личное мнение??
Нет, просто наблюдение: видно, что значительная чать инструментов Win10 и большинство приложений от MS написаны на .Net. Т.е. разработчики самой системы уже перешли на современные инструменты, лишь заимствовав готовые и совместимые модули из предшествующих поколений.

Последний раз редактировалось AnPis; 15.06.2021 в 21:13.
AnPis вне форума Ответить с цитированием
Старый 16.06.2021, 07:56   #4
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Так а что вы в конечном итоге хотите получить то??
Если рисунок 50*50 пикселей то нужно его перевести в мм с учетом разрешения принтера. Откуда у вас берутся заморочки то на пустом месте?
Если у вас dpi к примеру 400 на дюйм то квадратик 50 пикс = 50/400 * 25,4мм = 3,175мм
Подставляйте в код который я вам дал и получите что хотите.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 21.06.2021, 08:53   #5
AnPis
Пользователь
 
Регистрация: 02.04.2020
Сообщений: 30
По умолчанию

Спасибо, Мастер, за примерчик: он реально делает правильный вывод на печать. Отдохнул недельку и вот попробовал.
Но:
Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Если рисунок 50*50 пикселей то нужно его перевести в мм с учетом разрешения принтера. Откуда у вас берутся заморочки то на пустом месте?
Если у вас dpi к примеру 400 на дюйм то квадратик 50 пикс = 50/400 * 25,4мм = 3,175мм
Подставляйте в код который я вам дал и получите что хотите.
Вот тут получаю непонятные проблемы.
У меня принтер 300 dpi (точка 0,086 мм).
Надо картинку ~12х12 мм.
Создал картинку "шахматное поле" 100х100 пикселей.
При печати получаю 25,6х25,6 мм
Т.е. одна печатная точка картинки = 0,1 дюйма (???)
И вовсе не в миллиметрах.
Но прямоугольник рисуется честно.

Последний раз редактировалось AnPis; 21.06.2021 в 12:37.
AnPis вне форума Ответить с цитированием
Старый 21.06.2021, 11:32   #6
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от AnPis Посмотреть сообщение
Создал картинку "шахматное поле" 100х100 пикселей.
Код:
 private void Doc_PrintPage(object sender, PrintPageEventArgs e)
        {
            e.Graphics.PageUnit = GraphicsUnit.Millimeter;
            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            float pageWidthPix = (float)e.PageBounds.Width / e.PageSettings.PrinterResolution.X;

            Bitmap bmp = (Bitmap)Bitmap.FromFile("C:\\tmp.bmp");

            
            e.Graphics.DrawImage(bmp, new Rectangle(0, 0, 12, 12));// используем размер в миллиметрах           

            e.Graphics.DrawRectangle(Pens.Red, new Rectangle(5, 5, 40, 25)); // используем размер в миллиметрах           
        }
Ну вот этот код нормально рисует картинку в прямоугольник заданный в мм.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 21.06.2021, 13:17   #7
AnPis
Пользователь
 
Регистрация: 02.04.2020
Сообщений: 30
По умолчанию

Да, рисует, спасибо
Но я сначала скопировал Ваш код с Rectangle.
Он принимает целочисленные значения.
А у меня печатается баркод из png-файла, сгенеренный консольной программой в формате 108х108 пикселов.
И получается приблизительно 9х9 мм. Может плохо читаться из-за округления.
Но я покопался в справочнике и нашел перегрузку метода с RectangleF.
Буду пробовать.

Последний раз редактировалось AnPis; 21.06.2021 в 13:27.
AnPis вне форума Ответить с цитированием
Старый 21.06.2021, 13:40   #8
AnPis
Пользователь
 
Регистрация: 02.04.2020
Сообщений: 30
По умолчанию

Попутный вопрос:
а в каких единицах получается печатаемый текст?
Написал две строки:
Код:
            e.Graphics.DrawImage(Image.FromFile("out.png"), new RectangleF(2, 2, 11, 11));
            e.Graphics.DrawString("1234567890", new Font("Arial", 20F), Brushes.Black, new PointF(20, 10));
Баркод печатается как задумано 9х9 мм, а высота буков текста получается 5 мм.
Это в каких попугаях он рисует буковки?
AnPis вне форума Ответить с цитированием
Старый 21.06.2021, 13:44   #9
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от AnPis Посмотреть сообщение
Это в каких попугаях он рисует буковки?
Вот тут написано

У вас скорее всего это также будет в мм. Отпечатайте большую букву и сравните
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 21.06.2021, 14:20   #10
AnPis
Пользователь
 
Регистрация: 02.04.2020
Сообщений: 30
По умолчанию

Потому и вопрос задал: назначил мм в качестве единиц, битмап рисую, указываю мм, и получаю в мм, как и указал. Все замечательно.
В том же контексте /процедуре рисую текст Arial-ом, указываю не знаю в чем 20 единиц, получаю 1/4 от указанного в мм.
Я специально цифры вывожу, чтобы от размера буков не зависеть.
Ни параметр Height, ни параметр Size фонта не коррелируют с указанной величиной ни в каких единицах.
Указанные 20 единиц не транслируются в отпечатанный 5 мм размер буков ни в какой шкале.
Это не так принципиально, но хотелось бы понимать эти взаимосвязи.

Последний раз редактировалось AnPis; 21.06.2021 в 14:25.
AnPis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Печать на термо-принтера (чековых принтеров) slukl C# (си шарп) 5 22.06.2021 08:30
Прямая печать текста на принтер (У принтера отключен спулер и печать идет на прямую на принтер.) PAG Visual C++ 9 11.04.2016 16:41
Excel. Настройки принтера. Двухсторонняя печать Bagir Microsoft Office Excel 0 10.10.2012 00:47
Печать Image несколько копий в одной строке, + текст в низу картинки... Oleg Romanchuk Общие вопросы Delphi 0 10.11.2011 12:57
Работа с Printer. Частичный вывод листа из принтера. Izhic Общие вопросы Delphi 6 15.10.2008 08:57