前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >libjpeg:读取jpeg头获取图像基本信息(jpeg_read_header)

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

作者头像
10km
发布2022-05-07 10:17:26
1.4K0
发布2022-05-07 10:17:26
举报
文章被收录于专栏:10km的专栏10km的专栏

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

代码语言:javascript
复制
/* Decompression startup: read start of JPEG datastream to see what's there */
EXTERN(int) jpeg_read_header (j_decompress_ptr cinfo, boolean require_image);

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

以下是代码实现

代码语言:javascript
复制
/* (不解压缩)读取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内存解压缩塈转换色彩空间/压缩分辨率》中有定义。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档