Precisa de ajuda para ler arquivos JPEG usando libjpeg
Segui o código de exemplo no arquivo de exemplo libjpeg, mas não consegui ler os dados da image
Tenho a seguinte estrutura e criei uma instância dessa estrutur
struct ImageData {
unsigned char *pixels;
long width;
long height;
};
ImageData *imageData;
Abaixo está a minha função read_JPEG_file:
int read_JPEG_file (char * filename)
{
struct jpeg_decompress_struct cinfo;
struct my_error_mgr jerr;
/* More stuff */
FILE * infile; /* source file */
JSAMPARRAY buffer; /* Output row buffer */
int row_stride; /* physical row width in output buffer */
if ((infile = fopen(filename, "rb")) == NULL) {
fprintf(stderr, "can't open %s\n", filename);
return 0;
}
/* Step 1: allocate and initialize JPEG decompression object */
/* We set up the normal JPEG error routines, then override error_exit. */
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = my_error_exit;
/* Establish the setjmp return context for my_error_exit to use. */
if (setjmp(jerr.setjmp_buffer)) {
jpeg_destroy_decompress(&cinfo);
fclose(infile);
return 0;
}
/* Now we can initialize the JPEG decompression object. */
jpeg_create_decompress(&cinfo);
/* Step 2: specify data source (eg, a file) */
jpeg_stdio_src(&cinfo, infile);
/* Step 3: read file parameters with jpeg_read_header() */
(void) jpeg_read_header(&cinfo, TRUE);
/* Step 4: set parameters for decompression */
/* In this example, we don't need to change any of the defaults set by
* jpeg_read_header(), so we do nothing here.
*/
/* Step 5: Start decompressor */
(void) jpeg_start_decompress(&cinfo);
row_stride = cinfo.output_width * cinfo.output_components;
/* Make a one-row-high sample array that will go away when done with image */
buffer = (*cinfo.mem->alloc_sarray) ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
imageData = new ImageData;
imageData->width = cinfo.output_width;
imageData->height = cinfo.output_height;
imageData->pixels = new unsigned char [cinfo.output_width * cinfo.output_height * cinfo.output_components];
long counter = 0;
//step 6, read the image line by line
while (cinfo.output_scanline < cinfo.output_height) {
//IT ALWAYS crash ON THIS JPEG_READ_SCANLINES FUNCTION CALL BELOW
(void) jpeg_read_scanlines(&cinfo, (JSAMPARRAY)(imageData->pixels), 1);
counter +=row_stride;
}
/* Step 7: Finish decompression */
(void) jpeg_finish_decompress(&cinfo);
/* Step 8: Release JPEG decompression object */
/* This is an important step since it will release a good deal of memory. */
jpeg_destroy_decompress(&cinfo);
fclose(infile);
/* And we're done! */
return 1;
}
Falha sempre nesta função JPEG_READ_SCANLINES, na etapa 6 acima. Recebi um sinal "EXC_BAD_ACCESS" nessa linha.
Alguém tem alguma idéia ou tem alguns exemplos de trabalho sobre a leitura de arquivos .jpg com libjpeg que você pode compartilhar aqui? Verifiquei o tamanho dos meus imageData-> pixels e o comparei com o tamanho do próprio arquivo jpeg, e ele tem o mesmo tamanho. A memória para essa variável também foi alocada dinamicamente, por isso sei que não foi um problema de memóri
Alguma ideia