Qt多页TIFF

6
我需要从我的程序中保存一个多页TIFF文件,但似乎Qt不支持多页TIFF。尽管如此,我仍需要这样做。从我的程序中完成这个任务的最佳方法是什么?
到目前为止,我考虑使用ImageMagick的命令行实用程序从我创建的许多JPEG文件中创建多页TIFF,或者将libtiff添加到我的项目并尝试使用它,或者在Windows上使用GDI+生成TIFF。
还有其他想法吗?
如果可能的话,我想避免使用外部EXE或DLL,即如果我可以直接将库添加到我的项目源代码中,那将是最好的。
此外,如果您知道已经完成了这项工作的项目,请发布链接,我宁愿不要重新发明轮子。
2个回答

6

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

  1. 下载并解压libTIFF源代码
  2. 打开用于x64(或x32)的VS2010(或其他版本)cmd
  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手册 - http://www.remotesensing.org/libtiff/man/


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()函数或编写类似的内容,其中您需要:
  • TIFFClientOpen();
  • 遍历QImages列表
    • 设置每个QImage的页面
    • 执行QTiffHandler::write()的操作
  • TIFFClose();

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


太好了!我不知道Qt已经使用了libtiff。但是我该如何访问它呢?只是添加#include "tiffio.h"会提示没有这个文件或目录 - sashoalm
libtiff可以在src/3rdparty/libtiff/libtiff文件夹中找到。如何包含它取决于您的项目结构。 - akira
我在想,既然 Qt 已经链接到了 libtiff,我是否可以在不将其导入到我的项目中的情况下使用 libtiff,而是使用 Qt 构建的标头和库文件。但也许这些标头和库文件对我的程序不可访问。 - sashoalm
@satuon:这就是为什么我说:“它取决于你的项目结构”。这取决于你使用的qt版本如何构建libtiff,以及它是否是静态的还是插件。也许你需要构建自己的libtiff版本:如果你这样做了,我会保持版本与qt中使用的版本完全相同。 - akira
还没有,实际实现需要一些时间,但它似乎是一个相当合理的解决方案,并且肯定可以实现。 - sashoalm
我应该首先调用TIFFClientOpen(),然后使用QImage加载.tiff文件吗? - Crawl.W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接