Конференция "Media" » Вопрос по TIFF в libtiffDelphi [D7, WinXP]
 
  • Drg (02.02.12 16:39) [0]
    У меня вопрос по работе с TIFF посредством библиотеки libtiff (вернее с ее пре-компилированной версией для DELPHI).

    Сейчас разбираюсь с пре-компилированной (видимо в Билдере) библиотекой libtiff для Delphi. То есть имеется libtiffDelphi.pas и *.obj файлы для DELPHI. Имеются такого рода версии libtiff (3.7, 3.8, 3.9).

    Можно попросить Вас выложить примеры кода на DELPHI (для быстрого освоения) по простым основным (базисным) операциям с использованием методов libtiffDelphi:
    1) Открыть файл *.tif с любой упаковкой (включая LZW) и цветовым пространством (RGB, CMYK)
    2) Получить информацию о числе пикселей по вертикали и горизонтали и dpi
    3) Передать значения цветов пикселей массиву MxN (размера изображения) для обработки
    4) Записать в tiff массив MxN пикселей в цветовых пространствах (RGB, CMYK)с указанием dpi и метода компрессии (LZW)

    Опыта работы с libtiff никакого, так что без примеров долго разбираться, да и мне не нужно пока больше, чем описано выше.

    Я понимаю, что в тырнете много чего можно найти. Но я как то все проблемные коды нахожу от бедолаг просящих указать на ошибку в их программе (безответные вопросы), а реально работающих примеров всего два нашел и сильно вбок от моих вопросов .

    Заранее спасибо.
  • Омлет © (03.02.12 16:02) [1]
    А какой смысл использовать libtiff? Есть ведь специально на Delphi написанные библиотеки/классы.
  • Drg (03.02.12 17:58) [2]

    > А какой смысл использовать libtiff? Есть ведь специально
    > на Delphi написанные библиотеки/классы.


    О как. И где это в Delphi (включая RAD Studio XE2 Up3) имеются встроенные в пакет библиотеки и классы по работе с изображениями в формате tiff ?????? Я был бы очень рад этому, но найти не могу, а во всех книжках так и пишут, что встроенной полной поддержки tiff так и не удосужились опять сделать. Да, в одном месте можно открыть файл tiff, но записать и полноценно работать с различными цветовыми пространствами нельзя. Если же Вы знаете где такой класс находится в Delphi, то название и как его подключить дайте пожалуйста.

    Если насчет того зачем нужен tiff, то:
    На сей день в RAD студии нет ни одного поддерживаемого формата изображений, позволяющих осуществлять компрессию (для уменьшения объема) без потерь качества (методом упаковки данных (типа как rar и zip - это LZW TIFF, ZIP TIFF), а не аппроксимацией изображений), также нет возможности работать со CMYK (важно для печати). По этому tiff и является стандартом хранения данных в Полиграфии. В общем, отсутствует в RAD инструментарий для профессиональной обработки изображений начисто. Под профессиональным имеется ввиду, что не для целей любоваться картинкой, где 300 dpi -600 dpi -без разницы. А например, обрабатывать данные с микроскопа (записанные на матрицу) и распознавать там нужные области, вырезать их (и так далее), а затем сохранять без потерь нужные куски в архив (не пакованные изображения займут кучу места). То есть когда нужен каждый пиксель рассматривать на мониторе и записывать без потерь эти данные. Насчет CMYK  - ну захотите вы лучше конвертор RGB -> CMYK под свою узкую задачу сделать (а такие есть, где до сих пор хорошего нет) - и снова в пролете и снова с Delphi - нужен либо C++ либо libtiff подключать.

    Это как примеры, невозможности сейчас в Delphi вести полноценную обработку изображений.
  • Jeer © (03.02.12 19:50) [3]

    > вести полноценную обработку изображений


    Размечтался.
    Все есть, только платное - плати и будет тебе счастье.
    Кстати, не все платное - кое-что просто закрытое, ибо корпоративный ресурс.
  • Drg (03.02.12 20:00) [4]
    Ну выход то бесплатный есть, и он указан в шапке темы - причем наилучший выход. Библиотека libtiff создана разработчиками силикон графикс. Эта библиотека имеет самый расширенный инструментарий работы с tiff и включена в пакеты Photoshop (с коррекциями) и Matlab. Так что ее не зря прекомпилируют для Delphi. Осталось только с ней разобраться на должном уровне. Кстати, не все классы полезны, которые скрывают и ограничивают некоторую функциональность. Мне например класс, который только кидает в Canvas tiff, но не позволяет выбрать при записи LZW и CMYK и нафиг не нужен.

    Так что лучше давайте вместе осваивать libtiffDelphi. Так есть у кого примеры работающего кода или ссылки на него?
  • brother © (03.02.12 20:01) [5]
    > давайте вместе осваивать libtiffDelphi

    а оно нам надо?
  • Drg (03.02.12 20:29) [6]

    > а оно нам надо?

    Вы предлагаете заполнить ветку именами кому это не надо? Кому интересно тот напишет. А насчет тех кто жадничает делиться, - ну этот маневр не помогает обычно - просто недельку больше на освоение. А варианты решений всегда полезны.
  • QAZ (05.02.12 18:41) [7]

    > По этому tiff и является стандартом хранения данных в Полиграфии

    он не является стандартом хранения в полиграфии,а всеволиш стандартом приема растра на печать,с ограничениями,среди которых кокраз отсутствие компрессии

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

    для этого tiff вообще не нужен,также как и CMYK
    а нужен raw с матрицы (он кстати в 2 раза меньше чем tiff) и соотв. для этого софт

    > Насчет CMYK  - ну захотите вы лучше конвертор RGB -> CMYK
    > под свою узкую задачу сделать (а такие есть, где до сих
    > пор хорошего нет)

    в плане  RGB -> CMYK лучше ничего и никогда не будет сделано не в дельфи не на си, ибо это деградация цвета
    хочеш качественный CMYK - делай вручную,наглаз

    а хранить исключительно в формате оригинала,даже если это jpeg
  • Омлет © (06.02.12 10:58) [8]

    > О как. И где это в Delphi (включая RAD Studio XE2 Up3) имеются
    > встроенные в пакет библиотеки и классы по работе с изображениями
    > в формате tiff ?

    Встроенных нет. Есть, например, GraphicEx - http://www.soft-gems.net/index.php?option=com_content&task=view&id=13&Itemid=33
  • Drg (06.02.12 14:02) [9]
    Вот такие бы усилия на ответ на заданный вопрос как на выяснения зачем это нужно;)
    Все относительно - и  tiff в полиграфии таки является более частым стандартом для растровых изображений. Насчет несжатого tiff при подаче на печать, так это больше к вопросам снятия с себя ответственности за некорректно напечатанное (или ускорения печати) - там и к профилям могут начать придираться. Это уже больше из области психологии владельцев типографии. Но, по любому, это нюансы, которые тем паче лежат за возможностями встроенных возможностей Delphi, но которые могут быть решены в libtiff.
    Насчет RAW. Таки да и нет. А если метки и комментарии разные люди в разное время на картинку с микроскопа захотят добавлять и при этом не портить разрешение исходника? А если они еще и в разных местах и нет у них проги для RAW или не умеют ей пользоваться или лицензию за нее не хотят платить. А что RAW может Delphi править?

    Насчет CMYK. Ну вы меня таки заставляете задумки раскрывать. А если Вы захотите 3D анаглиф распечатать без гхоста? Напимер "mangeta" лезет сразу в два фильтра. Нет товарищи, тут по новому для каждого фильтра каллометрию нужно просчитывать и никакое "на глаз" не поможет - разоритесь на чернилах.

    Насчет библиотек. Ну наиболее признанной является freeimage, так она включает в себя библиотеки от законодателей стандартов. В частности, в freeimage включен тот же libtiff. Так что для функций freeimage варианты кода тоже интересны.
    Омлет Спасибо за ссылку (я ее знаю), но я как то к libtiff больше. libtiff используется намного более массово программистами на c++, да и на Matlab я поставленные мной задачи уже решил и то, что дает встроенный в Matlab libtiff меня устраивает и без проблем понимается Photoshop. Честно говоря, для меня ближе с++ и я бы на Builder перешел, если бы разработчики его не забросили - даже поддержку 64 не сделали и глюков больше. С другой стороны, заниматься на visual с++ мазохизмом с окнами надоело и времени нет, а JIT я не приемлю, так как ориентирован на производительные и критичные к времени приложения. Остается снова на Delphi частично вернуться. Кстати я не понимаю уже давно. Почему разработчики Delphi не позволят в коде (в тексте программы, а затем коде) делать преобразования форматов вызываемых в сторонних dll функций, чтобы не приходилось самому заголовки переписывать в dll и перераспространять правленые сторонние dll (нарушая лицензии владельцев dll) ? Это удобно получилось бы. Если уж какую функцию вызываешь, то и соответствие форматов не сложно определить, и не надо весь заголовок dll на будующее переписывать (чтобы заказчику с новой версией каждый раз новую dll не кидать), да с системными библиотеками работать можно.
  • Омлет © (06.02.12 14:34) [10]

    > Почему разработчики Delphi не позволят в коде (в тексте
    > программы, а затем коде) делать преобразования форматов
    > вызываемых в сторонних dll функций, чтобы не приходилось
    > самому заголовки переписывать в dll и перераспространять
    > правленые сторонние dll (нарушая лицензии владельцев dll)

    Э... Вы о чем? Какие преобразования форматов? В делфи есть все нужные типы, чтобы заголовочные функции для dll писать.
  • Drg (06.02.12 14:48) [11]
    >Э... Вы о чем? Какие преобразования форматов? В делфи есть все нужные типы, чтобы заголовочные функции для dll писать.
    Э ... Тогда вообще в чем проблемы - Берем libtiff откомпилированную в visual c++, а еще лучше DirectX и напрямую используем их функции в Delphi - так, али таки не так? ;)
  • Омлет © (06.02.12 15:16) [12]

    > Тогда вообще в чем проблемы - Берем libtiff откомпилированную
    > в visual c++, а еще лучше DirectX и напрямую используем
    > их функции в Delphi - так, али таки не так? ;)

    Так.
  • Омлет © (06.02.12 15:32) [13]
    Вот есть freeimage http://freeimage.sourceforge.net/ в который включен LibTIFF. И там же есть заголовочные файлы для Delphi, не требующие никаких перекомпиляций dll.
  • Drg (06.02.12 16:29) [14]
    Омлет
    Спасибо, про freeimage я постом выше написал :))) Насчет заголовочных файлов. Перекомпиляцию dll и раньше не надо было делать, но раньше надо было в dll переписать заголовок dll ручками в обычном редакторе. Впрочем, моя работа с Дельфи закончилась в свое время на D7 . Это здорово, что сейчас можно заголовки отдельно прикручивать без "трогания" самой dll. Сейчас думаю снова Delphi доосвоить, но когда Builder 64 появится, то наверное его буду использовать (когда интерфейс сложный надо делать).  
    Просьба таки остается. У кого есть примеры или ссылки по работы с tiff в libtiff или надстройке на ней freeimage?
  • dmk © (06.02.12 23:00) [15]
    По сабжу могу предоставить спецификацию TIFF 6.0 от Adobe в PDF. Написать "читалку" TIFF, да заодно и "писалку" включая LZW, Packbits и т.д. дело 0.5-3 месяцев в зависимости от степени владения Delphi. Занимался TIFF'ом очень плотно в свое время. В том числе CMYK'ом, LAB'ом и ICC-профилями.
    На мой взгляд, вам никто не предоставит готовых образцов работы с TIFF-файлами, кроме опубликованных в Интернет.
    Спецификацию брать отсюда: http://www.alternatiff.com/resources/TIFF6.pdf
  • Drg (07.02.12 12:41) [16]
    > никто не предоставит готовых образцов работы с TIFF-файлами
    Да, жаба страшный зверь ;)
  • Дмитрий Белькевич (07.02.12 20:02) [17]

    > Да, жаба страшный зверь ;)


    Ключ от квартиры надо?
  • Drg (07.02.12 21:58) [18]
    >Ключ от квартиры надо?
    Да нет, уже ничего не надо - пока тут ответа ждал почти уже сам разобрался. Говорю же - метод жабы не продуктивен. Это как по анекдоту: Ни печенья ни варенья, да и с ребятами как то не хорошо получилось ;)
  • QAZ (08.02.12 16:52) [19]

    > Говорю же - метод жабы не продуктивен

    ну раз сам уже разобрался,значит какраз продуктивен
    иначе такбы и сидел в ожидании очередного копипаста
  • Дмитрий Белькевич (10.02.12 19:26) [20]
    >Ни печенья ни варенья

    Ну как же, есть печенье и варенье:

    >почти уже сам разобрался
  • chizz (15.02.12 14:28) [21]
    Я тоже сейчас разбираюсь с этим зверем. Пока что смог открыть tif и пролистать его. Но открыл как-то не так... Через BitMap FirstPageBitmap.PixelFormat:=pf32bit;
    Вид - ужасный.
    Прокачаю тему, напишу сюда подробнее.

    Пока вот кусок кода:

    var
    my_tiff: PTIFF;
    FirstPageWidth,FirstPageHeight: Cardinal;
    FirstPageBitmap: TBitmap;
    listCount: integer;

    // переменные для изменения размера битмапа
    thumbRect : TRect;
    maxWidth, maxHeight: integer;

    begin

    my_tiff:=TIFFOpen('my.tif','r')  ; // 'a'- append

    // переход на страницу в Multi-page tiff'e

    listCount:=0;
        repeat
         listCount:=listCount+1;
        until ((TIFFReadDirectory(my_tiff)=-1) OR (listCount=StrToInt(Edit6.Text))) ;
    // -> BitMap

       TIFFGetField(my_tiff,TIFFTAG_IMAGEWIDTH,@FirstPageWidth);
      TIFFGetField(my_tiff,TIFFTAG_IMAGELENGTH,@FirstPageHeight);
      FirstPageBitmap:=TBitmap.Create;
      FirstPageBitmap.PixelFormat:=pf32bit;
     FirstPageBitmap.Width:=FirstPageWidth;
     FirstPageBitmap.Height:=FirstPageHeight;
      TIFFReadRGBAImage(my_tiff,FirstPageWidth,FirstPageHeight,
                  FirstPageBitmap.Scanline[FirstPageHeight-1],0);
     TIFFClose(my_tiff);

    // resize Bitmap and -> Image

     //proportional resize
        if FirstPageBitmap.Width > FirstPageBitmap.Height then
        begin
          thumbRect.Right := maxWidth;
          thumbRect.Bottom := (maxWidth * FirstPageBitmap.Height) div FirstPageBitmap.Width;
        end
        else
        begin
          thumbRect.Bottom := maxHeight;
          thumbRect.Right := (maxHeight * FirstPageBitmap.Width) div FirstPageBitmap.Height;
        end;
       //resize image
       FirstPageBitmap.Canvas.StretchDraw(thumbRect, FirstPageBitmap) ;
        FirstPageBitmap.Width := thumbRect.Right;
       FirstPageBitmap.Height := thumbRect.Bottom;

        //display in a TImage control
        Image1.Picture.Assign(FirstPageBitmap) ;



    Грызу сорцы LibTiff + http://libtiff.maptools.org/libtiff.html
  • seer © (08.03.12 23:06) [22]
    > пролистать его

    Пример кода можно? Что-то не получается пролистать.
  • AleksVoronezh © (20.03.12 13:08) [23]
    День добрый!

    И я сейчас занимаюсь этой темой. Пока что смог изображение со сканера записать с той или иной глубиной цвета и компрессией. В принципе, через GDI+ это сделать не трудно. Также легко отобразить на экране через GDI+, правда многостраничный tiff отображать не пробовал, а вот создать его пожалуй даже проще... Но вот в GDI+ не нашел средств для задания разрешения в файле - как поставить например 300dpi?
  • AleksVoronezh © (20.03.12 13:10) [24]
    День добрый!

    И я сейчас занимаюсь этой темой. Пока что смог изображение со сканера записать с той или иной глубиной цвета и компрессией. В принципе, через GDI+ это сделать не трудно. Также легко отобразить на экране через GDI+, правда многостраничный tiff отображать не пробовал, а вот создать его пожалуй даже проще... Но вот в GDI+ не нашел средств для задания разрешения в файле - как поставить например 300dpi? Нет ли у Вас информации по этому поводу, уважаемые участники?
  • AleksVoronezh © (20.03.12 13:10) [25]
    День добрый!

    И я сейчас занимаюсь этой темой. Пока что смог изображение со сканера записать с той или иной глубиной цвета и компрессией. В принципе, через GDI+ это сделать не трудно. Также легко отобразить на экране через GDI+, правда многостраничный tiff отображать не пробовал, а вот создать его пожалуй даже проще... Но вот в GDI+ не нашел средств для задания разрешения в файле - как поставить например 300dpi? Нет ли у Вас информации по этому поводу, уважаемые участники?
  • UA3GDW (22.04.12 21:40) [26]
    В Delphi XE2 можно вот так: http://radiosoft.info/index.php/blog/42-10
  • Pharmf153 (06.02.13 15:57) [27]
    Hello! efaaefe interesting efaaefe site! I'm really like it! Very, very efaaefe good!
  • Pharmg365 (06.02.13 15:57) [28]
    Hello! kgaegek interesting kgaegek site! I'm really like it! Very, very kgaegek good!
 
Конференция "Media" » Вопрос по TIFF в libtiffDelphi [D7, WinXP]
Есть новые Нет новых   [118670   +55][b:0][p:0.002]