Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Как купить рекламу на форуме


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

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

Купить рекламу на форуме 20000 рублей в месяц

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

Бьюсь над простейшей задачей: распечатать картинку товарного знака в точках принтера, или по крайней мере в заданном масштабе в составе этикетки.
Не могу приспособиться: битмап размером 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,663
По умолчанию

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

Код:
 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 Кб, 9 просмотров)
Тип файла: png p2.png (18.1 Кб, 9 просмотров)
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
Сообщений: 23
По умолчанию

Цитата:
Сообщение от 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,663
По умолчанию

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

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


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



Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS