c++ - libjpeg 中的错误处理

标签 c++ libjpeg

我正在使用 C++ JPEG 库 (libjpeg),我意识到当某些函数失败时会调用 exit() 并关闭应用程序。如何覆盖此行为并防止应用程序因 libjpeg 错误而关闭?

最佳答案

这是 libjpeg 的默认行为。为了使用 libjpeg 处理错误,您必须像这样定义错误处理例程:

struct jpegErrorManager {
    /* "public" fields */
    struct jpeg_error_mgr pub;
    /* for return to caller */
    jmp_buf setjmp_buffer;
};
char jpegLastErrorMsg[JMSG_LENGTH_MAX];
void jpegErrorExit (j_common_ptr cinfo)
{
    /* cinfo->err actually points to a jpegErrorManager struct */
    jpegErrorManager* myerr = (jpegErrorManager*) cinfo->err;
    /* note : *(cinfo->err) is now equivalent to myerr->pub */

    /* output_message is a method to print an error message */
    /*(* (cinfo->err->output_message) ) (cinfo);*/      
    
    /* Create the message */
    ( *(cinfo->err->format_message) ) (cinfo, jpegLastErrorMsg);

    /* Jump to the setjmp point */
    longjmp(myerr->setjmp_buffer, 1);
  
}

然后使用 jpeg_std_error 注册它。

FILE* fileHandler;
/* ... */
struct jpeg_decompress_struct cinfo;
jpegErrorManager jerr;
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = jpegErrorExit;
/* Establish the setjmp return context for my_error_exit to use. */
if (setjmp(jerr.setjmp_buffer)) {
    /* If we get here, the JPEG code has signaled an error. */
    cerr << jpegLastErrorMsg << endl;
    jpeg_destroy_decompress(&cinfo);
    fclose(fileHandler);
    return 1;
}

你可以找到一个完整的例子here .

关于c++ - libjpeg 中的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19857766/

相关文章:

c++ - 如何避免第三方库(无源代码)从物理内存分配内存?

c++ - 改进 InterlockedCompareExchange() 的原子读取

c++ - 在将变量声明为全局变量时给出了不同的答案

c++ - 使用 libjpeg/C++ 来自文件的 JPEG 编码位图 (BMP) 图像

r - jpeg R 包安装在非标准位置找不到 jpeglib.h

dll - 配置脚本不启用 make 生成共享库

c++ - SPOJ - 勇敢生活线段树

c++ -/lib64/libstdc++.so.6 找不到 CentOS 7.3

c++ - Visual Studio 2013 : fatal error: cannot open file 'libjpeg_d.lib'

ruby-on-rails - Heroku Cedar Stack(Ruby buildpack)上带有 image_optim gem 的 libjpeg