2013-11-13 5 views
0

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

#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 Альфтер вызова функции 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  

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

ответ

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, но результат тот же. – cbinder

+0

Что такое ваша платформа? С помощью нескольких модификаций (чтобы создать образец как чистый код C) он запускается в Mac OS X. Вы видели [это] (http://stackoverflow.com/questions/391917/jpeg-support-with-ijg-getting- нарушение доступа)? – deltheil

+0

Можете ли вы предложить шаги по созданию jpeg.lib на VS2005, для VS2010, мы можем использовать это: nmake/f makefile.vc setup-v10 для создания файла .sln, но мне нужно построить его на VS2005, его старый проект. – cbinder

 Смежные вопросы

  • Нет связанных вопросов^_^