2009-03-12 3 views
2

"Image"라는 변수에 JPEG 압축 바이트 스트림이 저장되어 있으며이 바이트 스트림을 RGB로 변환하려고합니다.JPEG로 압축 된 바이트 스트림에 jpeglib 사용

예 : unsigned char * Image;

내 질문은 : RGB 색상 값을 얻기 위해 jpeg_stdio_src()에 "이미지"를 전달할 방법이 있습니까?

누구나 jpeglib 라이브러리를 사용하여 "Image"라는 바이트 스트림에서 RGB를 얻을 수 있다고 말 할 수 있습니까?

고맙습니다.

답변

5

다음과 같이 시도해보십시오. 이것은 객체 currImage를 사용하여 결과를 저장합니다 (여기에 선언되지 않음).

typedef struct { 
    struct jpeg_source_mgr pub; // public fields 

    JOCTET * buffer;    // start of buffer 
    boolean start_of_file;  // have we gotten any data yet? 
} my_source_mgr; 

typedef my_source_mgr * my_src_ptr; 

static void jpg_memInitSource(j_decompress_ptr cinfo) 
{ 
    my_src_ptr src = (my_src_ptr) cinfo->src; 
    src->start_of_file = true; 
} 

static boolean jpg_memFillInputBuffer(j_decompress_ptr cinfo) 
{ 
    my_src_ptr src = (my_src_ptr) cinfo->src; 
    src->start_of_file = FALSE; 
    return TRUE; 
} 

static void jpg_memSkipInputData(j_decompress_ptr cinfo, long num_bytes) 
{ 
    my_src_ptr src = (my_src_ptr) cinfo->src; 
    if (num_bytes > 0) { 
    src->pub.next_input_byte += (size_t) num_bytes; 
    src->pub.bytes_in_buffer -= (size_t) num_bytes; 
    } 
} 

static void jpg_memTermSource(j_decompress_ptr cinfo) 
{ 
    // no work necessary here 
} 

void decompressJpeg(uint8 const *compressed, size_t len) 
{ 
    struct jpeg_decompress_struct cinfo; 
    struct jpeg_error_mgr   jerr; 
    my_src_ptr src; 

    // ToDo: change error handling to work with our return codes 
    cinfo.err = jpeg_std_error(&jerr); 
    jpeg_create_decompress(&cinfo); 

    cinfo.src = (struct jpeg_source_mgr *) 
    (*cinfo.mem->alloc_small) ((j_common_ptr) &cinfo, JPOOL_PERMANENT, 
    sizeof(my_source_mgr)); 
    src = (my_src_ptr) cinfo.src; 
    src->buffer = (JOCTET *)compressed; 

    src->pub.init_source = jpg_memInitSource; 
    src->pub.fill_input_buffer = jpg_memFillInputBuffer; 
    src->pub.skip_input_data = jpg_memSkipInputData; 
    src->pub.resync_to_restart = jpeg_resync_to_restart; 
    src->pub.term_source = jpg_memTermSource; 
    src->pub.bytes_in_buffer = len; 
    src->pub.next_input_byte = compressed; 

    jpeg_read_header(&cinfo, true); 
    jpeg_start_decompress(&cinfo); 

    // check: cinfo.out_color_space == JCS_RGB 

    currImage.setSize(
    (int)cinfo.output_width, (int)cinfo.output_height)); 

    size_t w = currImage.getWidth() * 3; 
    uint8 *p = (uint8*)currImage.getPixels(); 
    while (cinfo.output_scanline < cinfo.output_height) { 
    jpeg_read_scanlines(&cinfo, &p, 1); 
    p += w; 
    } 

    jpeg_finish_decompress(&cinfo); // Do this even under error conditions 
    jpeg_destroy_decompress(&cinfo); // Do this even under error conditions 
} 

편집 : 누락 된 지원 코드의 일부를 추가했습니다. 고마워, Edu Filipe!

+0

이것은 작동하지 않습니다. 해당 코드의 작동 버전을 제공하십시오. –

+1

@Edu : 조금 더 구체적인가요? #jpeglib를 #include하고 currImage 코드를 원하는 이미지 표현으로 바꿔야합니다. 여기서는 더 나은 메모리 정렬을 위해 스트라이드 조정없이 압축 된 RGB 픽셀로 이미지를 저장하는 객체를 사용합니다. C 또는 C++에는 단일 표준이 없습니다. 응용 프로그램에 적합한 표현을 사용해야합니다. –

+1

@ mr-fooz 실제로 콜백 함수를 구현하는 까다로운 부분은 코드에 없습니다. jpg_memFillInputBuffer, jpg_memSkipInputData 및 jpg_memTermSource와 같은 것들. –