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

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

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

любой другой идеи, которые я, возможно, пропустили?

Я бы хотел избежать использования внешних EXEs или 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 source
  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/