Qt多重TIFF

sas*_*alm 6 c++ qt tiff libtiff

我需要从我的程序中保存多页TIFF,但似乎Qt不支持多页TIFF.不过,我需要这样做.从我的程序中做到这一点最好的方法是什么?

到目前为止,我正在考虑使用ImageMagick的命令行实用程序从我创建的许多JPEG文件创建多页TIFF,或者将libtiff添加到我的项目并尝试使用它,或者使用GDI +(至少在Windows上)生成TIFF .

我可能错过了任何其他想法?

如果可能的话,我想避免使用外部EXE或DLL,即如果我可以直接将库添加到我的项目的源代码中,那将是最好的.

此外,如果您知道已经完成的项目,请发布一个链接,我宁愿不重新发明轮子.

Aus*_*tin 6

只是想在类似主题上添加我的信息.我最终只是从最新的(4.0.3)源代码构建了libTiff.我的项目都在x64中,但它非常简单:

  1. 下载并解压缩libTIFF源代码
  2. 为x64(或x32)cmd打开VS2010(或其他)
  3. cd到步骤1中的解压缩文件夹
  4. type: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);
}
Run Code Online (Sandbox Code Playgroud)

资料来源:从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/


aki*_*ira 4

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();
  • 迭代 QImage 列表
    • 设置每个 QImage 的页面
    • 做 QTiffHandler::write() 所做的事情
  • TIFF关闭();

另请参阅:http://code.google.com/p/multiphoton/source/browse/MatroxImagingLibrary.cpp? #1628