Qt多重TIFF

时间:2012-11-27 08:18:30

标签: c++ qt tiff libtiff

我需要从我的程序中保存多页TIFF,但似乎Qt doesn't support multipage TIFF。不过,我需要这样做。从我的程序中做到这一点最好的方法是什么?

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

  1. 下载并解压缩libTIFF源
  2. 打开x20(或x32)cmd的VS2010(或其他)
  3. cd到步骤1中的解压缩文件夹
  4. type:nmake / f makefile.vc
  5. 从/ libtiff文件夹中获取文件并添加到项目中
  6. 以下是读取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或写一些类似的东西,你在哪里:

  • TIFFClientOpen();
  • 遍历QImages列表
    • 根据QImage设置页面
    • 做QTiffHandler :: write()做的事情
  • TIFFClose();

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