如何使用jpg库从jpg中获取DC系数?

时间:2011-08-10 11:23:30

标签: c++ jpeg compression

我是新手,但我需要使用jpeg库从jpeg中获取dc系数? 有人告诉我,相应的函数在jdhuff.c中,但我找不到它。我试图找到一篇关于jpg库的文章,我可以得到这个,但到目前为止没有成功。

所以我希望你们能帮助我一点,并指出我要么提供一些文件或提示。 所以,这就是我所知道的:

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);
}

1 个答案:

答案 0 :(得分:0)

使用标准API无法做到这一点。使用libjpeg API,您可以获得的最接近的是Y / Cb / Cr通道的原始像素数据。

要获取系数数据,您需要破解decode_mcu函数(或其调用者)以保存在那里解码的数据。