2011-08-10 3 views
2

이 제품에 익숙하지 않지만 jpeg 라이브러리를 사용하여 jceg에서 DC 계수를 얻어야합니까? 해당 기능이 jdhuff.c에 있다는 힌트로 들었지만 찾을 수 없습니다. 나는 jpg 라이브러리에 관해서 내가 괜찮은 기사를 찾으려고했지만 지금까지 성공하지 못했다.jpg 라이브러리를 사용하여 jpg에서 DC 계수를 얻으려면 어떻게해야합니까?

저는 여러분들이 저를 조금 도와 주며 약간의 문서 나 힌트를 주길 바랍니다. 여기 내가 아는 바가 있습니다.

jpg 사진은 8x8 블록으로 구성됩니다. 그것은 64 픽셀입니다. 그 중 63은 AC이고 1은 DC입니다. 그게 계수 야. 위치는 배열 [0] [0]에 있습니다.

하지만 jpg 라이브러리로 정확히 어떻게 읽습니까? C++을 사용하고 있습니다.

편집 : 이것은 내가 지금까지 무엇을 가지고 :

read_jpeg::read_jpeg(const std::string& filename) 
{ 
    FILE* fp = NULL;    // File-Pointer 
    jpeg_decompress_struct cinfo; // jpeg decompression parameters 
    JSAMPARRAY buffer;    // Output row-buffer 
    int row_stride = 0;    // physical row width 
    my_error_mgr jerr;    // Custom Error Manager 


    // Set Error Manager 
    cinfo.err = jpeg_std_error(&jerr.pub); 
    jerr.pub.error_exit = my_error_exit; 

    // Handle longjump 
    if (setjmp(jerr.setjmp_buffer)) { 

     // JPEG has signaled an error. Clean up and throw an exception. 
     jpeg_destroy_decompress(&cinfo); 
     fclose(fp); 
     throw std::runtime_error("Error: jpeg has reported an error."); 
    } 

    // Open the file 
    if ((fp = fopen(filename.c_str(), "rb")) == NULL) 
    { 
     std::stringstream ss; 
     ss << "Error: Cannot read '" << filename.c_str() << "' from the specified location!"; 
     throw std::runtime_error(ss.str()); 
    } 

    // Initialize jpeg decompression 
    jpeg_create_decompress(&cinfo); 

    // Show jpeg where to read the data 
    jpeg_stdio_src(&cinfo, fp); 

    // Read the header 
    jpeg_read_header(&cinfo, TRUE); 

    // Decompress the file 
    jpeg_start_decompress(&cinfo); 

    // JSAMPLEs per row in output buffer 
    row_stride = cinfo.output_width * cinfo.output_components; 

    // Make a one-row-high sample array 
    buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); 

    // Read image using jpgs counter 
    while (cinfo.output_scanline < cinfo.output_height) 
    { 

     // Read the image 
     jpeg_read_scanlines(&cinfo, buffer, 1); 
    } 

    // Finish the decompress 
    jpeg_finish_decompress(&cinfo); 

    // Release memory 
    jpeg_destroy_decompress(&cinfo); 

    // Close the file 
    fclose(fp); 
} 

답변

0

이 표준 API를 사용 할 수 없습니다. libjpeg API를 사용하면 가장 가까운 Y/Cb/Cr 채널의 픽셀 데이터를 얻을 수 있습니다.

계수 데이터를 얻으려면 decode_mcu 함수 (또는 호출자)를 해킹하여 거기에서 디코딩 된 데이터를 저장해야합니다.