Мне нужно сохранить многостраничный TIFF из моей программы, но, похоже, Qt не поддерживает многостраничный TIFF. Тем не менее, мне нужно сделать это. Что было бы лучшим способом сделать это из моей программы?
До сих пор я думал об использовании утилиты командной строки ImageMagick для создания многостраничного TIFF из множества файлов JPEG, которые я создаю, или о добавлении libtiff в свой проект и попытке его использования, или использовании GDI + (по крайней мере в Windows) для генерации TIFF ,
Любые другие идеи, которые я мог пропустить?
Я хотел бы по возможности избегать использования внешних EXE или DLL, т. Е. Если бы я мог добавить библиотеку непосредственно к исходному коду моего проекта, это было бы лучше всего.
Кроме того, если вам известен проект, в котором он уже готов, опубликуйте ссылку на него, я бы не стал изобретать велосипед.
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 () или напишите что-нибудь подобное, где вы:
смотрите также: http://code.google.com/p/multiphoton/source/browse/MatroxImagingLibrary.cpp?#1628
Просто хотел добавить свою информацию по аналогичной теме. В итоге я просто собрал libTiff из последнего (4.0.3) источника. Мой проект все в x64, но это было довольно легко:
Вот пример чтения 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 Manuals — http://www.remotesensing.org/libtiff/man/