Библиотека Libjpeg

Тема в разделе "Общие вопросы по С и С++", создана пользователем cia, 26 янв 2007.

Статус темы:
Закрыта.
  1. cia

    cia Гость

    Здравствуйте.
    Помогите, пожалуйса, разобраться. Я недавно начал переходить на С++.

    Нужно загрузить изображение из файла, обработать его (пока только уменьшить размеры) и записать в другой файл.
    Вот код, почти стандартный (только попытка "скопировать" изображение).

    Код (Text):
    #include <cstdlib>
    #include <iostream>
    #include <jpeglib.h>

    using namespace std;

    int main()
    {
    struct jpeg_decompress_struct cinfo1;
    struct jpeg_error_mgr jerr;
    cinfo1.err=jpeg_std_error(&jerr);
    jpeg_create_decompress(&cinfo1);
    FILE * infile;
    if ((infile=fopen("1.jpg", "rb"))==NULL) {
    fprintf(stderr, "can't open %s\n","1.jpg");
    system("PAUSE");
    exit(1);
    }
    jpeg_stdio_src(&cinfo1,infile);
    jpeg_read_header(&cinfo1, TRUE);

    cinfo1.output_width=cinfo1.image_width;
    cinfo1.output_height=cinfo1.image_height;
    cinfo1.output_components=cinfo1.num_components;
    int row_stride = cinfo1.output_width * cinfo1.output_components;
    char* pixels = new char[cinfo1.output_height * row_stride];
    JSAMPARRAY buffer=(*cinfo1.mem->alloc_sarray) ((j_common_ptr)&cinfo1,JPOOL_IMAGE, row_stride, 1 );
    memset(*buffer, 0, sizeof(JSAMPLE)*row_stride);
    jpeg_start_decompress(&cinfo1);

    int y = 0;
    while (cinfo1.output_scanline<cinfo1.output_height) {
    jpeg_read_scanlines(&cinfo1,buffer,1);
    char* temp=&pixels[(cinfo1.output_height-y-1)*row_stride];
    memcpy(temp,buffer[0],row_stride);
    y++;
    }

    jpeg_finish_decompress(&cinfo1);
    jpeg_destroy_decompress(&cinfo1);
    fclose(infile);

    struct jpeg_compress_struct cinfo2;
    cinfo2.err = jpeg_std_error(&jerr);
    jpeg_create_compress(&cinfo2);

    FILE * outfile;
    if ((outfile = fopen("2.jpg", "wb")) == NULL) {
    fprintf(stderr, "can't open %s\n", "2.jpg");
    system("PAUSE");
    exit(1);
    }
    jpeg_stdio_dest(&cinfo2, outfile);

    cinfo2.image_height=cinfo1.output_height;
    cinfo2.image_width=cinfo1.output_width;
    cinfo2.input_components=cinfo1.output_components;
    cinfo2.in_color_space=cinfo1.out_color_space; /* colorspace of input image */
    jpeg_set_defaults(&cinfo2);

    jpeg_start_compress(&cinfo2,TRUE);
    JSAMPROW row_pointer[1];
    row_stride=cinfo2.image_width*cinfo2.input_compone nts;
    while (cinfo2.next_scanline<cinfo2.image_height) {
    row_pointer[0] = &buffer[cinfo2.next_scanline*row_stride][0];
    jpeg_write_scanlines(&cinfo2, row_pointer, 1);
    }
    jpeg_finish_compress(&cinfo2);
    jpeg_destroy_compress(&cinfo2);
    system("PAUSE");
    return EXIT_SUCCESS;
    }

    Извините за корявый код, я уже запарился с ним.
    Подскажите, пожалуйста, в чем ошибка.
    Программа вылетает при записи 32-й строки в файл, т.е. в строке
    jpeg_write_scanlines(&cinfo2, row_pointer, 1);
    Вылетает - это в смысле обращение за пределы массива.
    Буду очень признателен за помощь
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей