Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с большими TIFF-изображениями 
:(
    Опции темы
ActioN
Дата 30.6.2009, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 12.4.2005

Репутация: нет
Всего: нет



Доброго времени суток.
Мне необходимо работать в программе с большими TIFF-изображениями, а именно:
1. Выбираю нужные мне изображения;
2. Они располагаются на листе в определенных местах по заданным мной кординатам;
3. В конечном итоге я или посылаю их на печать или сохраняю в TIFF-файл (тут можно было хотябы послать на печать).
Параметры изображений: двухцветные TIFF-изображения больших размеров от 2000 пикселей до 65200х13600

Пока что выбрал для моей задачи компоненты ImageEN. Они довольно неплохо работают с TIFF больших размеров, но если размер изображения очень большой, то выполнение некоторых функций выполняется слишком долго, чаще всего даже не могу дождаться завершения выполнения и приходится завершать программу.

Кто-нибудь работал с этими компонентами? Или посоветуйте другие более подходящие для этого компоненты.
PM MAIL WWW   Вверх
Alexeis
Дата 30.6.2009, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(ActioN @  30.6.2009,  09:18 Найти цитируемый пост)
3. В конечном итоге я или посылаю их на печать или сохраняю в TIFF-файл (тут можно было хотябы послать на печать).
Параметры изображений: двухцветные TIFF-изображения больших размеров от 2000 пикселей до 65200х13600


  Принтер умеет печатать только bmp/jpg/png TIFF не умеет, поэтому прийдется их сконвертировать в bmp.
Картинка 65200х13600x3 = 2.5Гб ОЗУ. Во первых столько может не оказаться у компа, во вторых может не оказаться цельного блока такого размера, что очень вероятно, поскольку в win32 доступно как правило не больше 2х Гб для режима пользователя и в третьих 800 мегапикселей принтер не одолеет, разве что плоттер на лист A0, поэтому имеет смысл уменьшить изображения по крайней мере в несколько раз. Подумать только, декодировать 2,5 Гб информации, даже блочно не хватает ОЗУ, нужно использовать файлы для временного хранения, или же на лету при декодировании делать сжатие картинки в несколько раз, так чтобы полученная битмапка не занимала так много ОЗУ.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ActioN
Дата 30.6.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 12.4.2005

Репутация: нет
Всего: нет



Alexeis, это вполне реальная задача. Рулонный плоттер или принтер очень быстро справляется с такими картинками и печатает изображения размером 13600 в ширину, а в длинну неограничено. Но я ограничил до 65200 пикселей. Только вот как он это делает незнаю. Я думаю, тут главное вывести эти все изображения на канву и послать на печать, а остальное - дело драйверов и принтера. В ImageEn есть демка по печати изображений, она быстро справляется с большой картинкой. Но моя задача отличается тем, что у меня большая картинка строится из нескольких маленьких. Получается, задача сводится к тому, чтобы отобразить большую картинку как совокупность маленьких и просто послать на печать. Вопрос в том, как отобразить?

Может быть есть какая-то функция наподобие DrawTo(Canvas,X,Y), которая бы в нужном месте большой картинки отобразила маленькую в полный размер?

Добавлено @ 13:05
P.S. все изображения = 400 dpi.

Это сообщение отредактировал(а) ActioN - 30.6.2009, 13:23
PM MAIL WWW   Вверх
Alexeis
Дата 30.6.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(ActioN @  30.6.2009,  12:03 Найти цитируемый пост)
Может быть есть какая-то функция наподобие DrawTo(Canvas,X,Y), которая бы в нужном месте большой картинки отобразила маленькую в полный размер?

  У принтера есть Canvas, а у Canvas есть метод Draw.
Код

  Canvas.Draw(x, y, AnyGraphic);

Должно сработать. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ActioN
Дата 1.7.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 12.4.2005

Репутация: нет
Всего: нет



Alexeis, перепробовал много разных способов. Остановился на слоях, которые поддерживает ImageEN. Загружаю 10 изображений, каждое на свой слой (размеры каждого слоя по 7000х5000px) - все работает шустренько. Хоть оно и отмасштабировано и показываются превьюшки, но как ты и говорил, в памяти оно в натуральную величину хранится. Если начать соединять все слои в один, сразу начинаются тормоза - занимаемая программой оперативка начинает расти, что-то долго обрабатывается.
Мне тут подсказывают, что лучше для этих целей использовать векторную графику, т.к. для растровой не хватит оперативной памяти. Но проблема в переводе растрового TIFF-изображения в векторный. У меня тут их много, в ручную переводить каждое изображение будет долго и не рационально. Кто-нибудь сталкивался с такой задачей? Что посоветуете?

Это сообщение отредактировал(а) ActioN - 1.7.2009, 15:48
PM MAIL WWW   Вверх
Alexeis
Дата 1.7.2009, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(ActioN @  1.7.2009,  14:46 Найти цитируемый пост)
Мне тут подсказывают, что лучше для этих целей использовать векторную графику

  Переведенное изображение будет еще тяжелее чем исходное. Векторная графика это как исходники программы, а растровая это откомпилированный образ. Плоттер само по себе устройство векторное, растры он выводит по точкам, но тогда для него должно существовать свое API. Можно попробовать самому сделать огромный метафайл с кругом и пытаться его отрисовать на канве принтера. Если принтер будет его растеризировать то получаться те же яйца только в профиль, если он умный (кто знает), может он попытается рисовать сами линии записанные в метафайле, тогда больших размеров изображения не будет.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0458 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.