Tiff файлы

  • Автор темы alexey
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

alexey

#1
Проблема с сохранением Tiff файлов, сначала это была проблема как их открыть, т.к. под рукой были только tiff с LZW компрессией и на них все ругались, добрался до GraphicEx но и он не помог, но вот потом выяснилось что по тех заданию такого и не требуется - PageMaker все равно такое тоже не любит. Тогда остановился на GraphicEx и начал открывать с его помощью, потом в базу и обратно. Но вот проблема - содержимое файла после такого сохранения сильно меняется - размер может увеличиться раза в два и самое неприятное - изменяется рисунок - например разбивается на две части и они отображаются со смещением - прям Фотошоп какой-то :D.
Читаю-пишу стандартно - через DBImage. Сервер - SQLServer через ADO.
Delphi 5, поэтому LibTiffDelphi использовать не удалось.
 
B

Barmutik

#2
В качестве альтернативы можно попробовать читать и писать руками через TBlobStream ... с ним обычно всё работает нормально ...

Как будет работать TDBImage с незнакомым форматом (проинсталенным дополнииельно) вопрос отдельный .. может глюк где в библиотеке ...
 
A

alexey

#3
Согласен - так будет работать - так уже делал, но вся проблема в том, что мне нужно его еще и показывать в базе- например в той же dxGrid. С GraphicEx dc работает - файлы нормально показывает, читает, пишет в БД и показывает из нее же. Проблема только в момент сохранения - иногда сохраняет нормально. иногда нет. Похоже что в GraphicEx не поддержки сохранения Tiff, может что-то аналогичное есть?
И книга как специально исчезла - была у меня книга подробным и простым описанием работы нескольких графических форматов и работа с ними в Delphi(на более серьезные вещи просто нет времени).
 
B

Barmutik

#4
Я бы посоветовал присовать самому в гриде ... проблем на 30 минут работы .. а сохранение всё же на себя взять что бы избежать проблем ..
 
A

alexey

#5
В dx в общем-то можно, причем корректно и аккуратно на canvas. Но а чем рисовать-то? Файл будет лежать в bin поле и отнгюдь не в более-менее нормальном понятном для DB компонент формате а в своем родном. Конечно плюс - что содержимое файла в базе не будет отличаться от исходного файла.
Но кто ж его тогда поймет?
 
B

Barmutik

#6
Что-то не свосме поняно Ваше последнее .. Вы ж сами его в базу пишете ? Ну так же сами и читайте .. потом иея какой-нибудь TTiffImage и рисуйте на канве Вашего грида...
 
A

alexey

#7
Просто формат - скажем так, когда DBImage и им подобные сохраняют изображение в базе - то его формат отличается от формата - как правило добавляется заголовок и еще что-то, можно найти в исходниках думаю. Если же файл закачать напрямую - то компоненты часто отказываются его отображать. Хотя... - надо будет попробовать.
А теперь проблема - компонент для отрисовки какой-то TiffImage требует в качестве исходника к примеру файл - значит надо выгружатть в файл - жутко при большом количестве файлов. Если же ему требуется поток - .... тоже надо попробовать.
 
B

Barmutik

#8
Да как правило все такие компоненты имеют LoadFromStream ... я по крайней мере не видел такого что бы такого не было ...

Или поищите нормальный компонент если у Вашего такого нет ...
 
A

alexey

#9
Оп - готово!
Правда на 95% но все же.
Итак - главное направление поиска пошло от тебя.
Я случайно вспомнил что действительно - когда я экспериментировал еще летом с Access, BDE, ADO и blob полями то обнаружил - в это поле можно загрузить файл напрямую и даже его потом отобразить - тем же DBImage - просто при чтении информации из blob поля там сначал идет проверка заголовка и если он не совпадает то делается попытка читать влоб - тем же TBitMap - ведь класс изображения неизвестен(хотя далеко я не лазил, и может и неправ). Поэтому можно спокойно ручками выдирать файлы и сохранять (впорчем в DBImage я тоже все грузил и выгружал руками - такая специфика), вот только при отображении надо объяснить как отобразить данное изображение. Тогда я обратился к работе DxGrid - логика следующая - по умолчанию, если не стоит св-во CustomGraphic - то она работает также влоб - через TBitmap. Но если его установить - то тогда начинает работать обработчик OnGetGraphicClass - он то и должен возвратить нужный графический класс, иначе опять TBitMap и приложение ложится в IDE - в безконечном цикле ошибок. Кажется просто - определить этот самый класс - вопрос как - сами разработчики DX предложили создать поле для этого в базе и хранить там string с именем зарегестрированного в приложении класса. Получать имя класса можно при загрузке изображения - через Image.Picture.ClassName, тогда все просто - берем из поля имя класса и даем его на TGraphicClass(GetClass()). Но не тут то было! Оказывается клас надо зарегистрировать и GraphicEx несмотря на работающую регистрацию делает это немного не так, как того требует система(кстати этот момент я до конца не понял - и что не нравится ей?) Без этого GetClass выдает просто nil. Итак озверев к тому времени (ибо прошло часов пять самых разнообразных экспериментов) я засунул ругистрацию непосредственно в файл проекта - до загрузки всех форм обычным RegisterClasses. Ну а далее все пошло и поехало. Читаю - смотрю, сохраняю, выгружаю. Приятно.
Правда есть один глюк и кажется он в Dx - когда пытаюсь в одну гридину загружить несколько разных файлов по формату - вылетает с разнообразными ошибками через GraphicEx в тот же безеконечный цикл при отображении окна. Если же одновременно грузить фалы только одного формата - то все в порядке. Пока меня успокаивает тот факт - что по условию так все и будет работать, а будет время - надо будет разбираться далее. :unsure:
 
A

alexey

#11
А еще сжатые фалйы также можно обрабатывать, но нужно раскомментировать GraphicConfiguration.inc - алгоритм LZV. Правда других алгоритмов вроде не поддерживается.
 
Статус
Закрыто для дальнейших ответов.