Qt Multiage TIFF

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

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

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

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

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

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 ();
  • перебрать список QImages
    • установить страницу для QImage
    • делать то, что делает QTiffHandler::write()
  • TIFFClose();

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

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

  1. Загрузите и распакуйте исходный код libTIFF
  2. Откройте VS2010 (или что-то еще) для x64 (или x32) cmd
  3. перейдите к разархивированной папке с шага 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

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

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

Другие вопросы по тегам