Библиотека Libjpeg

  • Автор темы cia
  • Дата начала
Статус
Закрыто для дальнейших ответов.
C
#1
Здравствуйте.
Помогите, пожалуйса, разобраться. Я недавно начал переходить на С++.

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

Код:
#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);
Вылетает - это в смысле обращение за пределы массива.
Буду очень признателен за помощь
 
Статус
Закрыто для дальнейших ответов.