Qt многостраничный TIFF

Мне нужно сохранить многостраничный TIFF из моей программы, но, похоже, Qt не не поддерживает многостраничный TIFF. Тем не менее, мне нужно это сделать. Как лучше всего это сделать из моей программы?

До сих пор я думаю об использовании утилиты командной строки ImageMagick для создания многостраничного TIFF из многих файлов JPEG, которые я создаю, или о добавлении libtiff в мой проект и попытке его использования, или об использовании GDI+ (по крайней мере, в Windows) для создания TIFF .

Любые другие идеи, которые я мог пропустить?

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

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


person sashoalm    schedule 27.11.2012    source источник


Ответы (2)


Qt использует libtiff для чтения и записи TIFF. Так что я бы использовал ту же библиотеку, просто меньше головной боли. Во-вторых: посмотрите на http://qt.gitorious.org/qt/qt/blobs/4.8/src/gui/image/qtiffhandler.cpp, чтобы понять, как Qt записывает один QImage. Я думаю, для поддержки нескольких страниц вам нужно использовать TIFFSetField() (см. здесь, TIFFTAG_PAGENAME и TIFFTAG_PAGENUMBER). Я бы начал либо расширять функцию write() или напишите что-то подобное, где вы:

  • TIFFClientOpen();
  • iterate over a list of QImages
    • set the page per QImage
    • делать то, что делает QTiffHandler::write()
  • TIFFЗакрыть();

см. также: http://code.google.com/p/multiphoton/source/browse/MatroxImagingLibrary.cpp?#1628

person akira    schedule 27.11.2012
comment
Здорово! Я не знал, что Qt уже использует libtiff. Как мне добраться до него? Простое добавление #include "tiffio.h" дает мне no such file or directory. - person sashoalm; 27.11.2012
comment
libtiff можно найти в папке src/3rdparty/libtiff/libtiff. как включить это немного зависит от вас и вашей структуры проекта. - person akira; 27.11.2012
comment
Мне было интересно, если Qt уже ссылается на libtiff, я не могу использовать libtiff, не импортируя его в свой собственный проект, скорее, я буду использовать заголовки и файлы lib, с которыми построен Qt. Но, возможно, эти заголовки и файлы lib недоступны для моей программы. - person sashoalm; 27.11.2012
comment
@satuon: вот почему я сказал: это зависит от структуры вашего проекта. это зависит от того, как qt-версия, которую вы используете, построила libtiff, и является ли она чем-то статическим или плагином. возможно, вам придется создать свою собственную версию libtiff: если вы это сделаете, я бы оставил версию точно такой же, как та, что используется в qt. - person akira; 27.11.2012
comment
Пока нет, на самом деле его реализация займет у меня некоторое время, но это кажется вполне разумным решением, и его, безусловно, можно реализовать. - person sashoalm; 28.11.2012
comment
Я должен вызвать TIFFClientOpen(); сначала, а затем с помощью QImage загрузить файл .tiff? - person Crawl.W; 23.04.2019

Просто хотел добавить свою информацию по похожей теме. В итоге я просто собрал libTiff из последнего исходного кода (4.0.3). Мой проект полностью на x64, но это было довольно просто:

  1. Загрузите и разархивируйте исходный код libTIFF
  2. Откройте VS2010 (или что-то еще) для x64 (или x32) cmd
  3. cd в разархивированную папку с шага 1
  4. тип: nmake /f makefile.vc
  5. Извлеките файлы из папки /libtiff и добавьте в свой проект.

Вот пример чтения 16-битных данных TIFF:

    TIFF *MultiPageTiff = TIFFOpen("C:\\MultiPageTiff.tif", "r");

std::vector<unsigned short*> SimulatedQueue;

//Read First TIFF to setup the Buffers and init
//everything
int Width, Height;
//Bit depth, in bits
unsigned short depth;

TIFFGetField(MultiPageTiff, TIFFTAG_IMAGEWIDTH, &Width);
TIFFGetField(MultiPageTiff, TIFFTAG_IMAGELENGTH, &Height);
TIFFGetField(MultiPageTiff, TIFFTAG_BITSPERSAMPLE, &depth); 

//This should be Width*(depth / sizeof(char))
tsize_t ScanlineSizeBytes = TIFFScanlineSize(MultiPageTiff);

if(MultiPageTiff){
    int dircount = 0;
    do{
        dircount++;

        //I'm going to be QQueue'ing these up, so a buffer needs to be
        //allocated per new TIFF page
        unsigned short *Buffer = new unsigned short[Width*Height];

        //Copy all the scan lines
        for(int Row = 0; Row < Height; Row++){
            TIFFReadScanline(MultiPageTiff, &Buffer[Row*Width], Row, 0);
        }

        SimulatedQueue.push_back(Buffer);

    }while(TIFFReadDirectory(MultiPageTiff));

    TIFFClose(MultiPageTiff);
}

Источники: Сборка libTIFF из VS — http://www.remotesensing.org/libtiff/build.html#PC

Пример многостраничного TIFF — http://www.remotesensing.org/libtiff/libtiff.html

Разное Руководства Tiff — http://www.remotesensing.org/libtiff/man/

person Austin    schedule 25.06.2013