К вашему сведению, внешний "C" уже находится в текущем Ubuntu /usr/include/jpeglib.h из пакета libjpeg62-dev.

довал коду примера в файле примера libjpeg, однако я не смог прочитать данные изображения.

У меня есть следующая структура, и я создал экземпляр этой структуры.

 struct ImageData {
        unsigned char *pixels;
        long  width;
        long height;
    };

    ImageData *imageData;

Ниже моя функция read_JPEG_file:

int read_JPEG_file (char * filename)
{
    struct jpeg_decompress_struct cinfo;
    struct my_error_mgr jerr;

    /* More stuff */
    FILE * infile;      /* source file */
    JSAMPARRAY buffer;      /* Output row buffer */
    int row_stride;     /* physical row width in output buffer */

    if ((infile = fopen(filename, "rb")) == NULL) {
        fprintf(stderr, "can't open %s\n", filename);
        return 0;
    }

    /* Step 1: allocate and initialize JPEG decompression object */

    /* We set up the normal JPEG error routines, then override error_exit. */
    cinfo.err = jpeg_std_error(&jerr.pub);
    jerr.pub.error_exit = my_error_exit;
    /* Establish the setjmp return context for my_error_exit to use. */
    if (setjmp(jerr.setjmp_buffer)) {

        jpeg_destroy_decompress(&cinfo);
        fclose(infile);
        return 0;
    }
    /* Now we can initialize the JPEG decompression object. */
    jpeg_create_decompress(&cinfo);

    /* Step 2: specify data source (eg, a file) */

    jpeg_stdio_src(&cinfo, infile);

    /* Step 3: read file parameters with jpeg_read_header() */

    (void) jpeg_read_header(&cinfo, TRUE);
    /* Step 4: set parameters for decompression */

    /* In this example, we don't need to change any of the defaults set by
     * jpeg_read_header(), so we do nothing here.
     */

    /* Step 5: Start decompressor */

    (void) jpeg_start_decompress(&cinfo);


    row_stride = cinfo.output_width * cinfo.output_components;
    /* Make a one-row-high sample array that will go away when done with image */
    buffer = (*cinfo.mem->alloc_sarray) ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);

    imageData = new ImageData;
    imageData->width = cinfo.output_width;
    imageData->height = cinfo.output_height;

    imageData->pixels = new unsigned char [cinfo.output_width * cinfo.output_height * cinfo.output_components];
    long counter = 0;

   //step 6, read the image line by line
    while (cinfo.output_scanline < cinfo.output_height) {
        //IT ALWAYS crash ON THIS JPEG_READ_SCANLINES FUNCTION CALL BELOW
        (void) jpeg_read_scanlines(&cinfo, (JSAMPARRAY)(imageData->pixels), 1);
        counter +=row_stride;

    }
       /* Step 7: Finish decompression */

    (void) jpeg_finish_decompress(&cinfo);
    /* Step 8: Release JPEG decompression object */

    /* This is an important step since it will release a good deal of memory. */
    jpeg_destroy_decompress(&cinfo);

    fclose(infile);
    /* And we're done! */
    return 1;
}

В этой функции JPEG_READ_SCANLINES всегда происходит сбойна шаге 6 выше. Я получил сигнал "EXC_BAD_ACCESS" на этой линии.

У кого-нибудь есть идеи или есть несколько рабочих примеров чтения файла .jpg с помощью libjpeg, которыми вы можете поделиться здесь? Я проверил размер моего imageData-> пикселей и сравнил его с размером самого файла JPEG, и он имеет тот же размер. Память для этой переменной также распределяется динамически, поэтому я знаю, что это не было проблемой с памятью.

Есть идеи?

Ответы на вопрос(4)

Ваш ответ на вопрос