我需要从我的程序中保存多页TIFF,但似乎Qt doesn't support multipage TIFF。不过,我需要这样做。从我的程序中做到这一点最好的方法是什么?
到目前为止,我正在考虑使用ImageMagick的命令行实用程序从我创建的许多JPEG文件创建多页TIFF,或者将libtiff添加到我的项目并尝试使用它,或者使用GDI +(至少在Windows上)生成TIFF。
我可能错过了其他任何想法?
如果可能的话,我想避免使用外部EXE或DLL,即如果我可以直接将库添加到我项目的源代码中,那将是最好的。
另外,如果您知道某个项目已经完成,请发布一个链接,我宁愿不重新发明轮子。
答案 0 :(得分:6)
只是想在类似主题上添加我的信息。我最终只是从最新的(4.0.3)源代码构建了libTiff。我的项目都在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);
}
来源: 从VS建立libTIFF - http://www.remotesensing.org/libtiff/build.html#PC
示例MultiPage TIFF - http://www.remotesensing.org/libtiff/libtiff.html
混杂。 Tiff手册 - http://www.remotesensing.org/libtiff/man/
答案 1 :(得分:4)
Qt使用libtiff来读写TIFF。所以我会使用相同的库,只是不那么头痛。其次:查看http://qt.gitorious.org/qt/qt/blobs/4.8/src/gui/image/qtiffhandler.cpp以获得Qt如何编写一个QImage的线索。为了支持多个页面,我认为您需要使用TIFFSetField()
(请参阅here,TIFFTAG_PAGENAME和TIFFTAG_PAGENUMBER)。我会开始扩展write() function或写一些类似的东西,你在哪里:
另见:http://code.google.com/p/multiphoton/source/browse/MatroxImagingLibrary.cpp?#1628