Многостраничный 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, но это было довольно легко:
- скачать и распаковать libTIFF source
- откройте VS2010 (или что-то еще) для x64 (или x32) cmd
- cd в вашу распакованную папку с шага 1
- тип: nmake / F makefile.vc
- извлеките файлы из папки / 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/