Как я могу получить коэффициент DC от JPG с помощью библиотеки JPG? - PullRequest
2 голосов
/ 10 августа 2011

Я новичок в этом, но мне нужно получить коэффициент постоянного тока из jpeg, используя библиотеку jpeg?Мне подсказали, что соответствующая функция находится в jdhuff.c, но я не могу ее найти.Я попытался найти достойную статью о библиотеке jpg, где я могу получить это, но пока безуспешно.

Так что я надеюсь, что вы, ребята, сможете мне немного помочь и указать мне какую-нибудь документацию или получить подсказкуИтак, вот что я знаю:

Изображение в формате jpg состоит из блоков 8х8.Это 64 пикселя.63 из них названы AC, а 1 - DC.Это коэффициент.Позиция в массиве [0] [0].

Но как мне это точно прочитать с помощью библиотеки jpg?Я использую C ++.

edit: Это то, что у меня есть:

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 голосов
/ 22 января 2018

Это невозможно при использовании стандартного API.С помощью libjpeg API вы можете получить самые близкие необработанные данные о пикселях каналов Y / Cb / Cr.

Чтобы получить данные коэффициентов, вам нужно взломать функцию decode_mcu (или ее вызывающих) для сохраненияданные там декодируются.

...