libjpeg:读取jpeg头获取图像基本信息(jpeg_read_header)

libjpeg中的jpeg_read_header函数用于读取jpeg数据头部的基本信息,以下为jpeg_read_header的定义。

/* Decompression startup: read start of JPEG datastream to see what's there */
EXTERN(int) jpeg_read_header (j_decompress_ptr cinfo, boolean require_image);

有时候我们知道图像的基本信息,根据这些信息再决定是不是要解压缩这个图像,这时就可以用这个函数在不对图像解码的情况下获取图像的基本信息。

以下是代码实现

/* (不解压缩)读取jpeg格式的内存数据块的基本信息返回image_matrix_pram对象
 * 如果数据为空或读取数据出错抛出 jpeg_mem_exception
 */
image_matrix_pram read_jpeg_header_mem(uint8_t *jpeg_data,size_t size) {
    if(nullptr==jpeg_data||0==size)
        throw jpeg_mem_exception("empty image data");
    // 定义一个压缩对象
    jpeg_decompress_struct  dinfo;
    //用于错误信息
    jpeg_error_mgr jerr;
    // 错误输出绑定到压缩对象
    dinfo.err = jpeg_std_error(&jerr);
    // 设置自定义的错误处理函数
    jerr.error_exit = jpeg_mem_error_exit;
    // RAII对象在函数结束时释放资源
    gdface::raii buffer_guard([&](){
        //因为没有调用过jpeg_create_decompress(&dinfo),
        //所以这里不需要调用 jpeg_finish_decompress否则会抛出异常
        //jpeg_finish_decompress(&dinfo);
        jpeg_destroy_decompress(&dinfo);
    });
    // 初始化压缩对象
    jpeg_create_decompress(&dinfo);
    jpeg_mem_src(&dinfo, jpeg_data, (unsigned long)size); // 设置内存输出缓冲区
    (void) jpeg_read_header(&dinfo, true);

    image_matrix_pram matrix;
    // 填充图像基本信息结构
    matrix.width=dinfo.image_width;
    matrix.height=dinfo.image_height;
    matrix.color_space=dinfo.jpeg_color_space;
    matrix.channels=dinfo.num_components;
    return std::move(matrix);
}

raii ,image_matrix_pramjpeg_mem_error_exit在上一篇博客《libjpeg:实现jpeg内存解压缩塈转换色彩空间/压缩分辨率》中有定义。

阅读更多
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/50570553
个人分类: jpeg
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭