Ошибка чтения файла .jpeg с использованием libjpeg

0

Я получаю исключение NULL-указателя в функции jpeg_read_header() в следующем коде, в то время как файл входного изображения успешно считывается объектом FILE.

#include "jpeglib.h"
#include <iostream>

using namespace std;



void decode_frame(char *filename)
{
    unsigned char* raw_image;
    JSAMPROW row_pointer[1];
    unsigned long location = 0;

    struct jpeg_error_mgr jerr;
    struct jpeg_decompress_struct cinfo ;

    FILE *infile = fopen(filename, "rb" );

    if (infile == NULL )
    {
        printf("Error opening jpeg file %s\n!", filename );
        return -1;
    }
    cinfo.err = jpeg_std_error(&jerr);

    /* create decompressor */
    jpeg_create_decompress(&cinfo);

    /* this makes the library read from infile */
    jpeg_stdio_src(&cinfo, infile );

    /* read jpeg header */
    jpeg_read_header(&cinfo, TRUE);

    /* decompress */
    jpeg_start_decompress(&cinfo);

    /*allocate memory */
    raw_image = (unsigned char*)malloc( cinfo.output_width*cinfo.output_height*cinfo.num_components );

    /* now actually read the jpeg into the raw buffer */
    row_pointer[0] = (unsigned char *)malloc( cinfo.output_width*cinfo.num_components );
    /* read scanlines */
    while (cinfo.output_scanline < cinfo.output_height) {
        jpeg_read_scanlines( &cinfo, row_pointer, 1 );
        for( int i=0; i < cinfo.image_width*cinfo.num_components;i++) 
            raw_image[location++] = row_pointer[0][i];
    }  

    /* clean up */
    jpeg_finish_decompress(&cinfo);
    jpeg_destroy_decompress(&cinfo);
    fclose( infile );
    free( row_pointer[0] );
}

int main(){
    char *f = "Example.jpg";
    decode_frame(f);
    return 0;
}

Значение вызова функции cinfo alfter jpeg_stdio_src(&cinfo, infile ):

cinfo{err=0x0020f8fc mem=0x021cb320 progress=0x00000000 ...}
progress             0x00000000 {progress_monitor=??? pass_counter=??? pass_limit=??? ...}
client_data          0xcccccccc  void *
is_decompressor      1 
global_state         200    
src 0x021c4480       {next_input_byte=0x00000000 <Bad Ptr> bytes_in_buffer=0 init_source=0x686ccb50 ...}    
image_width          0  
image_height         0  
num_components       0
jpeg_color_space     JCS_UNKNOWN    
out_color_space      JCS_UNKNOWN
scale_num            0      
scale_denom          0      
output_gamma         0.00000000000000000    
buffered_image       0  
raw_data_out         0
dct_method           JDCT_ISLOW     

Где я ошибаюсь? Это первый раз, когда я использую библиотеку изображений.

Теги:
image
jpeg
libjpeg

1 ответ

0

Глобальное состояние 200 означает (согласно исходному коду libjpeg):

#define DSTATE_START 200 /* after create_decompress */

Вызов jpeg_stdio_src только для создания структуры распаковщика, то есть он выделяет внутренний cinfo->src и инициализирует другое состояние декомпрессора.

Другими словами, синтаксический анализ файлов JPEG еще не начался: так что здесь нет проблем.

Вам нужно хотя бы выполнить jpeg_read_header чтобы убедиться, что структура cinfo заполнена всей информацией метаданных (image_width, image_height, jpeg_color_space и т.д.). Если на этом этапе что-то пойдет не так, это может быть связано с вашим файлом JPEG, который может быть поврежден (?).

Вы видите что-то вроде Not a JPEG file напечатанного на stderr?

  • 0
    Я получаю исключение NULL-указателя в jpeg_read_header () fn только ... в связи с повреждением файла JPEG, я пробовал несколько файлов JPEG, но результат тот же.
  • 0
    Какая у тебя платформа? С несколькими модификациями (чтобы ваш пример представлял собой чистый C-код) он работает на Mac OS X. Вы видели это ?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню