6

我需要从我的程序中保存一个多页 TIFF,但似乎Qt 不支持多页 TIFF。不过,我需要这样做。从我的程序中执行此操作的最佳方法是什么?

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

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

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

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

4

2 回答 2

6

只是想添加我关于类似主题的信息。我最终只是从最新的(4.0.3)源构建 libTiff。我的项目都在 x64 中,但这很容易:

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

资料来源:从 VS 构建 libTIFF - http://www.remotesensing.org/libtiff/build.html#PC

多页 TIFF 示例 - http://www.remotesensing.org/libtiff/libtiff.html

杂项。Tiff 手册 - h​​ttp: //www.remotesensing.org/libtiff/man/

于 2013-06-25T18:11:10.323 回答
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();
  • 遍历 QImages 列表
    • 设置每个 QImage 的页面
    • 做 QTiffHandler::write() 做的事情
  • TIFF关闭();

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

于 2012-11-27T08:51:35.990 回答