Я согласен с Эрнаном. Это не очень хороший интерфейс (я думаю, что сам внутренний код, вероятно, хорош), если только вам действительно не нужно работать на низком уровне (а может, даже тогда) Я думаю, что ImageMagick, вероятно, лучше. У них есть интерфейс «MagickWand» C более высокого уровня, не говоря уже о том, что он поддерживает гораздо больше форматов.
Однако мне было любопытно узнать интерфейс libjpeg, поэтому я получил тестовую программу, работающую на мое удовлетворение, основанную на вашей программе-примере, а также libjpeg.doc , пример IJG и ИСПОЛЬЗУЯ БИБЛИОТЕКУ JPEG IJG . Во всяком случае, вот код. Он просто распечатывает размеры и RGB первого пикселя каждой строки.
Я очень удивлен, что вы получили ошибку с моим кодом. Он прекрасно работает для меня, и компилируется без каких-либо предупреждений. Может кто-нибудь еще проверить это?
#include <stdio.h>
#include <assert.h>
#include <jpeglib.h>
int main(int argc, char* argv[])
{
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
JSAMPARRAY buffer;
int row_stride;
//initialize error handling
cinfo.err = jpeg_std_error(&jerr);
FILE* infile;
infile = fopen("Sample.jpg", "rb");
assert(infile != NULL);
//initialize the decompression
jpeg_create_decompress(&cinfo);
//specify the input
jpeg_stdio_src(&cinfo, infile);
//read headers
(void) jpeg_read_header(&cinfo, TRUE);
jpeg_start_decompress(&cinfo);
printf("width: %d, height: %d\n", cinfo.output_width, cinfo.output_height);
row_stride = cinfo.output_width * cinfo.output_components;
buffer = (*cinfo.mem->alloc_sarray)
((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
JSAMPLE firstRed, firstGreen, firstBlue; // first pixel of each row, recycled
while (cinfo.output_scanline < cinfo.output_height)
{
(void)jpeg_read_scanlines(&cinfo, buffer, 1);
firstRed = buffer[0][0];
firstBlue = buffer[0][1];
firstGreen = buffer[0][2];
printf("R: %d, G: %d, B: %d\n", firstRed, firstBlue, firstGreen);
}
jpeg_finish_decompress(&cinfo);
return 0;
}