天天看點

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||==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記憶體解壓縮塈轉換色彩空間/壓縮分辨率》中有定義。