用C++中的libtiff读取tiff文件:避免警告打印

3

使用C++中的libtiff读取tiff文件:避免警告消息输出

当读取tiff文件时,每当函数TIFFReadDirectory()读取到未知标签时,控制台就会输出一条警告消息。根据用户Borovsky提供的答案,我了解到如果要避免这种情况,需要执行以下操作:

“首先创建一个类,该类继承自TiffErrorHandler并重载WarningHandler和WarningHandlerEx方法。在这些方法中,实际上可以什么都不做。 然后使用SetErrorHandler方法将类的一个实例设置为库的错误处理程序。该方法是静态的,您可以在打开图像之前设置错误处理程序。”

问题在于,我是C++的初学者,虽然我理解了如何实现上述操作,但我似乎找不到TiffErrorHandler类。我的代码如下:

class myTiffErrorHandler : public TIFFErrorHandler {  <- THE CLASS CANNOT BE FOUND

  public: 
      void WarningHandler() { }  
      void WarningHandlerEx() { } 

};

在我的main()函数中,我所做的一切都是:

Main() {

   tif = TIFFOpen(“fn.tif”, "r"));  

int numOfFrames=0;

    do {
        numOfFrames++;
    } while (TIFFReadDirectory(tif));
}

有人可以帮我解决这个问题吗?我做错了什么,这个类在哪里被定义了?

谢谢。

1个回答

2

您所参考的答案是使用C#中的面向对象封装来处理libtiff,而您使用C++的情况不同。您需要做的是定义一个虚拟警告/错误处理程序,如下所示:

void DummyHandler(const char* module, const char* fmt, va_list ap)
{
    // ignore errors and warnings (or handle them your own way)
}

然后使用函数TIFFSetWarningHandler来替换默认处理程序,像这样:

main() 
{
    // disable warnings
    TIFFSetWarningHandler(DummyHandler);

    tif = TIFFOpen("fn.tif", "r");  

    int numOfFrames=0;

    do {
        numOfFrames++;
    } while (TIFFReadDirectory(tif));
}

请注意,您也可以使用NULL参数调用TIFFSetWarningHandler,但我喜欢在仅在发布版本中#ifdef掉处理程序,以便我仍然可以在调试版本中看到警告。

谢谢,我使用了NULL选项并解决了我的问题。不过,我喜欢你使用空函数的方法,但是当我使用TIFFSetWarningHandler(DummyHandler)时,编译器指出我需要提供参数输入。我尝试将输入参数设置为void,但也没有起作用。我做错了什么吗? - user2762182
@user2762182,上面的语法没有问题,对我来说很好用——可能在不同的平台/编译器上会有所不同。(虽然我不能立即想出为什么)我使用的是Windows和Visual Studio——你呢? - Roger Rowland
我也使用Windows 7,MSVC++ 2012(专业版)。我使用编译没有任何特殊标志,但不幸的是,我没有足够的经验来处理TIFF函数调用。对我来说,让多页tiff读取功能正常工作是一场斗争,而打印输出导致整个过程变得太慢。您使用空函数的想法非常好,将解决我另一个问题。 - user2762182

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