Подскажите свободно распространяемую библиотеку (совместимую с Windows) или исходник, в котором из JPEG файла выделялись квантованные косинусные коэффициенты. Это первый шаг обратного JPEG-декодирования (коды Huffman-а в DCT-коэффициенты). Я знаю алгоритм как это сделать, но очень не хочется заново изобретать велосипед и тратить время на тестирование самопальной программы.
Это можно сделать с помощью 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;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Вот функция, перепробовал десятки вариантов, но не могу понять, где здесь утекает память? Проверял банальным вызовом функции 1000 раз, забирало...
Придумал задачу и пытаюсь ее решить: хочу поставить пароль на жесткий диск, и сделать это на C++При помощи каких библиотек/классов это можно...
Как редактировать страницы tabcontrol в c++? Я добавил на Dialog новый tab, как добавить новую страницу к tabcontrol и расположить на ней(странице) элементы?...
Предлагаемая разработчиками MySQL библиотека "Connector" слишком много весит - больше всего файла установщика моего приложения, и даже больше распакованного...