Декодирование JPEG

213
27 сентября 2017, 11:12

Подскажите свободно распространяемую библиотеку (совместимую с Windows) или исходник, в котором из JPEG файла выделялись квантованные косинусные коэффициенты. Это первый шаг обратного JPEG-декодирования (коды Huffman-а в DCT-коэффициенты). Я знаю алгоритм как это сделать, но очень не хочется заново изобретать велосипед и тратить время на тестирование самопальной программы.

Answer 1

Это можно сделать с помощью libjpeg.

Пример (отсюда: Extracting JPEG DCT coefficients):

#include <stdio.h>
#include <jpeglib.h>
#include <iostream>
using namespace std;
JBLOCKARRAY rowPtrs[MAX_COMPONENTS];
void read(jpeg_decompress_struct srcinfo, jvirt_barray_ptr * src_coef_arrays) {
    //cout << "Started reading DCT" << endl;
    for (JDIMENSION compNum=0; compNum < srcinfo.num_components; compNum++) {
        size_t blockRowSize = (size_t) sizeof(JCOEF) * DCTSIZE2 * srcinfo.comp_info[compNum].width_in_blocks;
        for (JDIMENSION rowNum=0; rowNum < srcinfo.comp_info[compNum].height_in_blocks; rowNum++) {
            // A pointer to the virtual array of dct values
            rowPtrs[compNum] = ((&srcinfo)->mem->access_virt_barray)((j_common_ptr) &srcinfo, src_coef_arrays[compNum],rowNum, (JDIMENSION) 1, FALSE);
            // Loop through the blocks to get the dct values
            for (JDIMENSION blockNum=0; blockNum < srcinfo.comp_info[compNum].width_in_blocks; blockNum++){
                //...iterate over DCT coefficients
                for (JDIMENSION i=0; i<DCTSIZE2; i++){
                    //and print them to standard out - one per line
                    cout << rowPtrs[compNum][0][blockNum][i] << endl;
                }
            }
        }
    }
}
int main() {
  //TODO: change this to read a different file
  const char* filename = "image4.jpg";
  FILE * infile;  
  struct jpeg_decompress_struct srcinfo;
  struct jpeg_error_mgr srcerr;
  if ((infile = fopen(filename, "rb")) == NULL) {
    fprintf(stderr, "can't open %s\n", filename);
    return 0;
  }
  srcinfo.err = jpeg_std_error(&srcerr);
  jpeg_create_decompress(&srcinfo);
  jpeg_stdio_src(&srcinfo, infile);
  (void) jpeg_read_header(&srcinfo, FALSE);
  //coefficients
  jvirt_barray_ptr * src_coef_arrays = jpeg_read_coefficients(&srcinfo);
  read(srcinfo, src_coef_arrays);
  jpeg_destroy_decompress(&srcinfo);
  fclose(infile);
  return 0; 
}
READ ALSO
C++ WMI не могу понять, где здесь утечка памяти

C++ WMI не могу понять, где здесь утечка памяти

Вот функция, перепробовал десятки вариантов, но не могу понять, где здесь утекает память? Проверял банальным вызовом функции 1000 раз, забирало...

201
Установка пароля на HDD языком C++

Установка пароля на HDD языком C++

Придумал задачу и пытаюсь ее решить: хочу поставить пароль на жесткий диск, и сделать это на C++При помощи каких библиотек/классов это можно...

171
Как редактировать страницы tabcontrol

Как редактировать страницы tabcontrol

Как редактировать страницы tabcontrol в c++? Я добавил на Dialog новый tab, как добавить новую страницу к tabcontrol и расположить на ней(странице) элементы?...

166
Как на C++ подключиться к MySQL по SLL вручную (без MySQL Connector)?

Как на C++ подключиться к MySQL по SLL вручную (без MySQL Connector)?

Предлагаемая разработчиками MySQL библиотека "Connector" слишком много весит - больше всего файла установщика моего приложения, и даже больше распакованного...

205