Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.08;
Скачать: [xml.tar.bz2];




Вниз

Сложная печать графики 


GarryFV   (2001-11-05 12:35) [0]

Эта проблема уже начинает доставать. И разобраться оказалось не так просто, как казалось :).

Нужно вывести на принтер большое количество сложных графических объектов(до нескольких десятков тысяч). Сразу скажу что пользоваться Printer.Canvas я умею, но при выводе на него эта процедура занимает опять же десятки минут.
Вывод: нужно самому сформировать bitmap и отправить его на принтер, но здесь возникают другие проблемы:
Разрешение принтера 600 dpi, в пикселах это около 7000 х 4000
color rgb - 4 байта,
размер bitmap -> 7000 x 4000 x 4 = 112000000 = 107 M

К тому же функции BitBlt и StretchBlt с принтером работают довольно загадочно (кто не знает, тому долго и нудно придется объяснять, а кто знает - тот поймет).

И ЧТО ЖЕ ДЕЛАТЬ?

Может подскажете хоть где почитать. Потому что даже в MSDN все описывается только на уровне стандартных GDI объектов, а здесь
нужна скорее какая-то технология для печати подобного рода графики.

Заранее спасибо.



Dimka Maslov   (2001-11-05 13:51) [1]

Основополагающий принцип работы программ для Windows: вывод данных только при помощи стандартных процедур, предоставляемых операционной системой, по-этому придётся ждать десятки минут, если хочется обрабатывать большие объёмы информации.



GarryFV   (2001-11-05 16:28) [2]

Неверный ответ :).
На DC экрана весь этот объем выводится за пару секунд. Стандартными GDI функциями. А вот на DC принтера пол-дня, грубо говоря, а если объем слегка великоват, то принтеру и мозгов не хватает.

Фокус в том, что для вывода на печать не нужно формировать полноцветный bitmap на 100М (см. вопрос). Я уже молчу, если принтер не цветной.
Так что, самому делать пребразование цветов к 256, например?
Тоже не то. Тем более, что размер уменшится только в 4 раза, т.е. 25М будет.
Еще раз говорю - нужна технология какая-то. Можно, например, создать bitmap в 4 раза меньшего размера, а затем стандартным способом Stretch-ить на принтер. Но это вроде как изврат какой-то.

Работает же Photoshop как-то. И выводит весьма масштабные изображения довольно шустро.

Так никто не знает, где почитать то можно?

BTW: BitmapHandle:=CreateCompatibleBitmap(DC,4960,7014); - не работает, возвращает 0.
Наибольшее, что удалось создать - 3562 Х 5616.



Anatoly Podgoretsky   (2001-11-05 17:34) [3]

А если еще разделишь на 8 то получишь всего то 3 мб
Каждый пиксель на принтере имеет всего два состояния 0 или 1
Но вот захочешь ли ты делать преобразозвания в монохром это другой вопрос.
Не знаю может стоит помучиться с метафайлами?



GarryFV   (2001-11-06 12:28) [4]

Я не сказал, что принтер всегда черно-белый. Просто для полной оптимизации можно учесть и это.
Ну что ж, вопрос, как я вижу, действительно серьезный.
Никто ни черта не знает ;).



Raptor   (2001-11-06 22:28) [5]

Привет!

Читал я как то об этом. Вроде у Дарахвелидзе в книге "Delphi 4" есть пример работы с очень большими изображениями. Там для этого использовались файлы отображаемые в память.

Raptor.



Иван Шихалев   (2001-11-06 23:31) [6]

ИМХО, для принтера метафайлы куда лучше битмапов.




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.08;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.029 c
1-22022           victor                2001-12-18 08:05  2002.01.08  
Нужен Label для отображения формул


1-22237           PVR                   2001-12-16 17:20  2002.01.08  
TListView помогите сортировать


1-22148           Delphimun             2001-12-20 12:10  2002.01.08  
Как послать системе сообщение, что нажата клавиша?


7-22434           tomas2001             2001-09-24 14:04  2002.01.08  
Передача файла по модему


1-22138           Serg5                 2001-12-20 09:22  2002.01.08  
Люди, скажите, а как очистить Image1, функции Clear что то не нашёл...