bool JpegDecoder::readData( Mat& img ) { bool result = false; int step = (int)img.step; bool color = img.channels() > 1; if( m_state && m_width && m_height ) { jpeg_decompress_struct* cinfo = &((JpegState*)m_state)->cinfo; JpegErrorMgr* jerr = &((JpegState*)m_state)->jerr; JSAMPARRAY buffer = 0; if( setjmp( jerr->setjmp_buffer ) == 0 ) { /* check if this is a mjpeg image format */ if ( cinfo->ac_huff_tbl_ptrs[0] == NULL && cinfo->ac_huff_tbl_ptrs[1] == NULL && cinfo->dc_huff_tbl_ptrs[0] == NULL && cinfo->dc_huff_tbl_ptrs[1] == NULL ) { /* yes, this is a mjpeg image format, so load the correct huffman table */ my_jpeg_load_dht( cinfo, my_jpeg_odml_dht, cinfo->ac_huff_tbl_ptrs, cinfo->dc_huff_tbl_ptrs ); } if( color ) { if( cinfo->num_components != 4 ) { cinfo->out_color_space = JCS_RGB; cinfo->out_color_components = 3; } else { cinfo->out_color_space = JCS_CMYK; cinfo->out_color_components = 4; } } else { if( cinfo->num_components != 4 ) { cinfo->out_color_space = JCS_GRAYSCALE; cinfo->out_color_components = 1; } else { cinfo->out_color_space = JCS_CMYK; cinfo->out_color_components = 4; } } jpeg_start_decompress( cinfo ); buffer = (*cinfo->mem->alloc_sarray)((j_common_ptr)cinfo, JPOOL_IMAGE, m_width*4, 1 ); uchar* data = img.data; for( ; m_height--; data += step ) { jpeg_read_scanlines( cinfo, buffer, 1 ); if( color ) { if( cinfo->out_color_components == 3 ) icvCvt_RGB2BGR_8u_C3R( buffer[0], 0, data, 0, cvSize(m_width,1) ); else icvCvt_CMYK2BGR_8u_C4C3R( buffer[0], 0, data, 0, cvSize(m_width,1) ); } else { if( cinfo->out_color_components == 1 ) memcpy( data, buffer[0], m_width ); else icvCvt_CMYK2Gray_8u_C4C1R( buffer[0], 0, data, 0, cvSize(m_width,1) ); } } result = true; jpeg_finish_decompress( cinfo ); } } close(); return result; }
void processimage (const void *p, int l) { struct jpeg_decompress_struct mycinfo; struct my_error_mgr myjerr; JSAMPARRAY jpegbuffer=NULL; int row_stride; mycinfo.err = jpeg_std_error(&myjerr.pub); myjerr.pub.error_exit = my_error_exit; if (setjmp(myjerr.setjmp_buffer)) { jpeg_destroy_decompress(&mycinfo); return ;/*exit(0);*/ } jpeg_create_decompress(&mycinfo); jpeg_memory_src(&mycinfo, p, l) ; ((memory_source_mgr *)mycinfo.src)->pub.next_input_byte = (JOCTET*)p; ((memory_source_mgr *)mycinfo.src)->pub.bytes_in_buffer = l; jpeg_read_header(&mycinfo, TRUE); mycinfo.out_color_space = JCS_RGB; mycinfo.dct_method = JDCT_IFAST; mycinfo.jpeg_color_space = JCS_YCbCr; my_jpeg_load_dht( &mycinfo, my_jpeg_odml_dht, mycinfo.ac_huff_tbl_ptrs, mycinfo.dc_huff_tbl_ptrs ); jpeg_start_decompress(&mycinfo); row_stride = mycinfo.image_width * mycinfo.num_components; if(rgb == NULL){ IMG_WIDTH=mycinfo.image_width; IMG_HEIGHT=mycinfo.image_height; rgb = (int *)malloc(sizeof(int) * (IMG_WIDTH*IMG_HEIGHT)); } if(jpegbuffer==NULL){ jpegbuffer = (*mycinfo.mem->alloc_sarray) ((j_common_ptr) &mycinfo, JPOOL_IMAGE, row_stride, 1); } int y = 0; int *outp=rgb; while ( mycinfo.output_scanline < mycinfo.image_height) { jpeg_read_scanlines(&mycinfo, jpegbuffer, 1); int xx; int x3; for(xx = 0, x3 = 0; xx < IMG_WIDTH && x3 < row_stride; xx++, x3 += 3) { outp[y+xx] = 0xff000000 | jpegbuffer[0][x3 + 2]<<16 | jpegbuffer[0][x3 + 1]<<8 | jpegbuffer[0][x3 + 0]; } y+=IMG_WIDTH; } jpeg_finish_decompress(&mycinfo); jpeg_destroy_decompress(&mycinfo); }