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_pram
和 jpeg_mem_error_exit
在上一篇博客《libjpeg:实现jpeg内存解压缩塈转换色彩空间/压缩分辨率》中有定义。