Вывод на 2-цветный принтер
От: Аноним  
Дата: 05.09.05 10:46
Оценка:
Приветствую, Олл!

Вот такая проблемка возникла.
Программа должна печатать картинки. Печатает, все нормально, пока дело не дошло до тестирования на subj. Тут, естественно, получилось, что все , что не белое — черное
MS PAINT, тем не менее, печатает внешне нормально. Приглядевшись, я понял как он это делает. Он закрашивает области некоторого исходного цвета мелкой сеточкой из черных и белых пикселей, так что издалека они выглядят серыми той или иной интенсивности.
Вопрос — есть ли средства это сделать самому ? В Win32, насколько я знаю, нет, или я неправ ? Может, кто знает библиотеку для этого ?

P.S. Задача мелкая, и поэтому серьезные пакеты предлагать не надо. Из пушек по воробьям я стрелять не буду, просто оставлю как есть. Мне бы простенькую функцию SpecBitBlt
Re: Вывод на 2-цветный принтер
От: Pavel Dvorkin Россия  
Дата: 05.09.05 10:47
Оценка:
Здравствуйте, Аноним, Вы писали:

По ошибке отправлено от Анонима
With best regards
Pavel Dvorkin
Re: Вывод на 2-цветный принтер
От: Andrew S Россия http://alchemy-lab.com
Дата: 05.09.05 11:23
Оценка:
А>Приветствую, Олл!

А>Вот такая проблемка возникла.

А>Программа должна печатать картинки. Печатает, все нормально, пока дело не дошло до тестирования на subj. Тут, естественно, получилось, что все , что не белое — черное

Почему естественно? На мой взгляд, совсем нет.

А>MS PAINT, тем не менее, печатает внешне нормально. Приглядевшись, я понял как он это делает. Он закрашивает области некоторого исходного цвета мелкой сеточкой из черных и белых пикселей, так что издалека они выглядят серыми той или иной интенсивности.

А>Вопрос — есть ли средства это сделать самому ? В Win32, насколько я знаю, нет, или я неправ ? Может, кто знает библиотеку для этого ?

Павел, я очень сомневаюсь, что пайнтбраш делает что то большее, чем просто выводит то, что у него в memDC на DC принтера.
А что такой за "двухцветный" принтер, драйвер которого не поддерживает градаций серого? Очень странно. Может, имеет смысл привести минимальный код, который воспроизводит указанное вами поведение?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[2]: Вывод на 2-цветный принтер
От: Pavel Dvorkin Россия  
Дата: 06.09.05 03:45
Оценка:
Здравствуйте, Andrew S, Вы писали:

А>>Приветствую, Олл!


А>>Вот такая проблемка возникла.

А>>Программа должна печатать картинки. Печатает, все нормально, пока дело не дошло до тестирования на subj. Тут, естественно, получилось, что все , что не белое — черное

AS>Почему естественно? На мой взгляд, совсем нет.


А что же он, грешный, делать может, если у принтера есть только 2 цвета ? Это все равно, что копировать на контекст с монохромной битовой картой — классическая ошибка начинающих.


AS>Павел, я очень сомневаюсь, что пайнтбраш делает что то большее, чем просто выводит то, что у него в memDC на DC принтера.


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

AS>А что такой за "двухцветный" принтер, драйвер которого не поддерживает градаций серого?


GetDeviceCaps(hdcPrinter,NUMCOLORS) == 2. Для других ч/б принтеров 256.

Очень странно. Может, имеет смысл привести минимальный код, который воспроизводит указанное вами поведение?

for( int i = 0; i < 256; i++)
SetPixel(hdcPrinter,i,0,RGB(i,i,i));

выводит строку из одинаковых черных точек (и в конце, надо полагать, одну белую, но ее не видно
With best regards
Pavel Dvorkin
Re: Вывод на 2-цветный принтер
От: Master Gekus Россия  
Дата: 06.09.05 04:31
Оценка: 6 (1)
Здравствуйте, Pavel Dvorkin, Вы писали:

А>Программа должна печатать картинки. Печатает, все нормально, пока дело не дошло до тестирования на subj. Тут, естественно, получилось, что все , что не белое — черное

[...]
А>Вопрос — есть ли средства это сделать самому?

А>P.S. Задача мелкая, и поэтому серьезные пакеты предлагать не надо. Из пушек по воробьям я стрелять не буду, просто оставлю как есть. Мне бы простенькую функцию SpecBitBlt

Так старый добрый StretchBlt! Только перед вызовом сделать
SetStretchBltMode(hDC, STRETCH_HALFTONE);

Не Photoshop, конечно — но вполне прилично растеризует...

С уважением,
Заливочкин Евгений
Re[2]: Вывод на 2-цветный принтер
От: Pavel Dvorkin Россия  
Дата: 06.09.05 05:20
Оценка:
Здравствуйте, Master Gekus, Вы писали:

MG>Так старый добрый StretchBlt! Только перед вызовом сделать
SetStretchBltMode(hDC, STRETCH_HALFTONE);


Попробую, как только опять до этого принтера доберусь. Хотя сомневаюсь что-то я...

HALFTONE Maps pixels from the source rectangle into blocks of pixels in the destination rectangle. The average color over the destination block of pixels approximates the color of the source pixels.

О том, что здесь полутоновое изображение изменится так, что области будут залиты некоей несплошной кистью, и речи нет. Average color на destination может быть только черным или белым, а надо чтобы был "черно-белым"

И потом

This option is not supported on Windows 95/98/Me.
With best regards
Pavel Dvorkin
Re[3]: Вывод на 2-цветный принтер
От: Andrew S Россия http://alchemy-lab.com
Дата: 06.09.05 08:40
Оценка:
PD>А что же он, грешный, делать может, если у принтера есть только 2 цвета ? Это все равно, что копировать на контекст с монохромной битовой картой — классическая ошибка начинающих.

Вообще то он должен делать полутоновую растеризацию. Как это делает драйвер экрана в 16-ти цветном режиме. Кстати, каким образом вы создаете контекст принтера? В devmode есть параметры цветности и параметры полутоновости. Посмотрите DocumentProperties, а так же
DocumentProperties или, что еще удобнее, PrintDlg. Я не верю, чтобы в вашем драйвере принтера эти параметры не настраивались. Кстати, и 256 тоже маловато — обычно черно-белые принтеры имеют 4096 цветов при стандартном халфтонинге.

AS>>Павел, я очень сомневаюсь, что пайнтбраш делает что то большее, чем просто выводит то, что у него в memDC на DC принтера.


PD>Ну и я пробовал, естественно, это делать. На других принтерах нормально, так что содержимое memDC вне подозрений.


Зато под подозрением содержимое hdcPrinter
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re: Вывод на 2-цветный принтер
От: goto Россия  
Дата: 06.09.05 09:05
Оценка: 6 (1)
Не знаю, насколько у Вас задача "мелкая". Если действительно нужно, могу написать, как потратить на решение задачи < дня с помощью бесплатной граф. библиотеки или своего кода.
Re[4]: Вывод на 2-цветный принтер
От: Pavel Dvorkin Россия  
Дата: 06.09.05 10:15
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Вообще то он должен делать полутоновую растеризацию. Как это делает драйвер экрана в 16-ти цветном режиме. Кстати, каким образом вы создаете контекст принтера? В devmode есть параметры цветности и параметры полутоновости. Посмотрите DocumentProperties, а так же

AS>DocumentProperties или, что еще удобнее, PrintDlg.

Вот именно от PrintDlg с параметром PD_RETURNDC.

>Я не верю, чтобы в вашем драйвере принтера эти параметры не настраивались.


Может, они там и настраиваются...


AS>Зато под подозрением содержимое hdcPrinter


Согласен...
With best regards
Pavel Dvorkin
Re[5]: Вывод на 2-цветный принтер
От: Andrew S Россия http://alchemy-lab.com
Дата: 06.09.05 10:17
Оценка:
AS>>Вообще то он должен делать полутоновую растеризацию. Как это делает драйвер экрана в 16-ти цветном режиме. Кстати, каким образом вы создаете контекст принтера? В devmode есть параметры цветности и параметры полутоновости. Посмотрите DocumentProperties, а так же
AS>>DocumentProperties или, что еще удобнее, PrintDlg.

PD>Вот именно от PrintDlg с параметром PD_RETURNDC.


Покажи, как именно.

>>Я не верю, чтобы в вашем драйвере принтера эти параметры не настраивались.


PD>Может, они там и настраиваются...


Не может, а настраиваются. Как минимум DEVMODE за это отвечает.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[6]: Вывод на 2-цветный принтер
От: Pavel Dvorkin Россия  
Дата: 07.09.05 06:35
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>>>Вообще то он должен делать полутоновую растеризацию. Как это делает драйвер экрана в 16-ти цветном режиме. Кстати, каким образом вы создаете контекст принтера? В devmode есть параметры цветности и параметры полутоновости. Посмотрите DocumentProperties, а так же

AS>>>DocumentProperties или, что еще удобнее, PrintDlg.

PD>>Вот именно от PrintDlg с параметром PD_RETURNDC.


AS>Покажи, как именно.


Да просто

PRINTDLG pd;
memset(&pd, 0, sizeof(PRINTDLG));
pd.lStructSize = sizeof(PRINTDLG);
pd.hwndOwner = hWnd;
pd.Flags = PD_RETURNDC ;
pd.hInstance=hInst;
if (PrintDlg(&pd))
// pd.hDC он и есть


>>>Я не верю, чтобы в вашем драйвере принтера эти параметры не настраивались.


PD>>Может, они там и настраиваются...


AS>Не может, а настраиваются. Как минимум DEVMODE за это отвечает.


Andrew, я подумал еще раз над проблемой — дело не в этом. Пусть там даже есть какая-то настройка. Пусть я что-то делаю неправильно. Но вернемся к MS Paint. Если у этого принтера есть возможность настроиться на 256 или более оттенков, то Paint должен был это сделать и банально выводить эту область однотонным серым цветом соответствующей интенсивности (как он и делает на других принтерах). Однако он это не делает, вмето этого он выводит реально монохромный рисунок, а область заливает комбинированной кистью. Значит, не может. Так что дело не в моих ошибках, если даже они и есть, а в том, что Paint это делает как-то иначе, чем просто BitBlt.
With best regards
Pavel Dvorkin
Re[2]: Вывод на 2-цветный принтер
От: Pavel Dvorkin Россия  
Дата: 07.09.05 06:36
Оценка:
Здравствуйте, goto, Вы писали:

G>Не знаю, насколько у Вас задача "мелкая". Если действительно нужно, могу написать, как потратить на решение задачи < дня с помощью бесплатной граф. библиотеки или своего кода.


Буду благодарен. Можно на мой e-mail dvorkin@omsu.ru
With best regards
Pavel Dvorkin
Re[7]: Вывод на 2-цветный принтер
От: Аноним  
Дата: 07.09.05 07:01
Оценка: 9 (1)
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>... Но вернемся к MS Paint...


При желании можно посмотреть как он устроен...
\win2k\private\windows\shell\accesory\mspaint
Re[8]: Вывод на 2-цветный принтер
От: Pavel Dvorkin Россия  
Дата: 07.09.05 07:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>... Но вернемся к MS Paint...


А>При желании можно посмотреть как он устроен...

А>\win2k\private\windows\shell\accesory\mspaint

Большое спасибо. Взглянул туда и все сразу стало ясно, так как обнаружил

CImgBrush::ColorToMonoBitBlt
With best regards
Pavel Dvorkin
Re[7]: Вывод на 2-цветный принтер
От: Andrew S Россия http://alchemy-lab.com
Дата: 07.09.05 07:48
Оценка:
PD>Andrew, я подумал еще раз над проблемой — дело не в этом. Пусть там даже есть какая-то настройка. Пусть я что-то делаю неправильно. Но вернемся к MS Paint. Если у этого принтера есть возможность настроиться на 256 или более оттенков, то Paint должен был это сделать и банально выводить эту область однотонным серым цветом соответствующей интенсивности (как он и делает на других принтерах).
Павел, дело в том, что это должен делать драйвер. Т.е., например, в моем принтере есть различные схемы дизеринга, в том числе и черно-белая. Принтер сам осуществляет, на уровне железа и драйвера, полутоновое смешивание. И выглядит это именно как хитрый браш (для струйного принтера). Другое дело, что, как выяснилось, для 2-х цветного режима ms paint применяет другую схему блиттинга. Но я бы все-таки на твоем месте попробовал попросить от принтера поддержку полутонов в DEVMODE. А что за принтер, кстати?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[8]: Вывод на 2-цветный принтер
От: Pavel Dvorkin Россия  
Дата: 07.09.05 09:33
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Павел, дело в том, что это должен делать драйвер. Т.е., например, в моем принтере есть различные схемы дизеринга, в том числе и черно-белая. Принтер сам осуществляет, на уровне железа и драйвера, полутоновое смешивание. И выглядит это именно как хитрый браш (для струйного принтера).


Хм, не совсем понял. Из каких таких соображений драйвер принтера будет делать то, о чем его не просил никто? Если его hDC монохромный и GetDeviceCaps честно об этом говорит, то не его ума дело устраивать мне дизеринг. Может, я и сам какие-то меры уже принял (а ля paint), может, именно монохром и хочу.


>Другое дело, что, как выяснилось, для 2-х цветного режима ms paint применяет другую схему блиттинга. Но я бы все-таки на твоем месте попробовал попросить от принтера поддержку полутонов в DEVMODE.


Лень . И потом, это задачу до конца все равно не решает. А если поддержки полутонов так таки и нет ? Классический матричный Epson, к примеру ?

>А что за принтер, кстати?


А черт его знает. Он не у меня, а у заказчика, а к нему съездить надо (в Омске же, но в другом месте).
With best regards
Pavel Dvorkin
Re[3]: Вывод на 2-цветный принтер
От: goto Россия  
Дата: 07.09.05 10:48
Оценка:
Послал по почте. Прочитал свой же предыдущий пост. Очень похоже на рекламу гербалайфа.
Re[4]: Вывод на 2-цветный принтер
От: Pavel Dvorkin Россия  
Дата: 07.09.05 11:28
Оценка:
Здравствуйте, goto, Вы писали:

G>Послал по почте. Прочитал свой же предыдущий пост. Очень похоже на рекламу гербалайфа.


With best regards
Pavel Dvorkin
Re[9]: Вывод на 2-цветный принтер
От: Andrew S Россия http://alchemy-lab.com
Дата: 07.09.05 12:08
Оценка:
PD>Хм, не совсем понял. Из каких таких соображений драйвер принтера будет делать то, о чем его не просил никто? Если его hDC монохромный и GetDeviceCaps честно об этом говорит, то не его ума дело устраивать мне дизеринг. Может, я и сам какие-то меры уже принял (а ля paint), может, именно монохром и хочу.

Если монохромный, то не будет. Если нет поддержки палитры, конечно. Правда, драйверов принтера с поддержкой палитры я не видел.

>>Другое дело, что, как выяснилось, для 2-х цветного режима ms paint применяет другую схему блиттинга. Но я бы все-таки на твоем месте попробовал попросить от принтера поддержку полутонов в DEVMODE.


PD>Лень . И потом, это задачу до конца все равно не решает. А если поддержки полутонов так таки и нет ? Классический матричный Epson, к примеру ?


Еще раз, Павел, это зависит от ДРАЙВЕРА, а не от принтера. Любой струйный принтер при использовании только черного картриджа, да и многие, особенно древние, лазерные, имеют только 2 градации черного — черный и отсутствие черного Настройками можно заставить практически любой драйвер из входящих в стандартную поставку винды, а уж тем более современных принтеров, обсчитывать полутона, которые как раз при малом dpi и выглядят как браш. При этом драйвер в зависимости от настроек будет отдавать различное количество цветов, в зависимости от режима полутонов. Я бы все-таки порекомендовал сначала убедиться, что драйвер поддерживает только монохромный DC, а уже затем применять программный халфтонинг.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.