Я работаю над проектом обработки изображений, где мне нужно написать все на C и использовать библиотеку libjpeg, потому что на машине, которую я использую, нет альтернативы, и я специально запрещен к установке новые библиотеки.Распределение памяти в c & libjpeg
Теперь у меня возникла проблема с чтением цикла JPEG в файле read_JPEG_, то есть при возникновении ошибки сегментации (сбрасывается ядром). Точнее, ошибка указана на jpeg_scan_lines jpeg_read_scanlines (& cinfo, & ptr, 1); Что я делаю не так?
#include <stdio.h>
#include <omp.h>
#include <time.h>
//#include <iostream>
#include <stdlib.h>
#include <unistd.h>
//include <stdbool.h>
//#include <cstring>
#include <string.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "doc/turbojpeg.h"
//#include <jmorecfg.h>
#include <jerror.h>
#include <jconfig.h>
#include <setjmp.h>
#include <jpeglib.h>
#define NUM_IMAGES 100
typedef struct
{
unsigned char *pixels; /* Points to large array of R,G,B-order data */
unsigned long height; /* Number of rows in image */
unsigned long width; /* Number of columns in image */
}ImageData;
struct my_error_mgr
{
struct jpeg_error_mgr pub; /* "public" fields */
jmp_buf setjmp_buffer; /* for return to caller */
};
typedef struct my_error_mgr * my_error_ptr;
METHODDEF(void) my_error_exit (j_common_ptr cinfo)
{
my_error_ptr myerr = (my_error_ptr) cinfo->err;
(*cinfo->err->output_message) (cinfo);
longjmp(myerr->setjmp_buffer, 1);
}
int READ_JPEG_FILE (char * filename, ImageData * image)
{
int bytes_per_pixel = 3;
struct jpeg_decompress_struct cinfo;
struct my_error_mgr jerr;
unsigned char *ptr = NULL;
unsigned int i, ipos;
FILE * infile=NULL;
printf("%s\n","initializations done for reading JPEG");
//if file can't be opened
if ((infile = fopen(filename, "rb")) == NULL)
{
fprintf(stderr, "can't open %s\n", filename);
return 0;
}
//override standard error
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = my_error_exit;
//define what must be done when error occurs
if (setjmp(jerr.setjmp_buffer))
{
jpeg_destroy_decompress(&cinfo);
fclose(infile);
return 0;
}
printf("%s\n","Overriden error messages, yey mom!");
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, infile);
jpeg_read_header(&cinfo, TRUE);
jpeg_start_decompress(&cinfo);
long *w =malloc(sizeof(unsigned long));
long *h=malloc(sizeof(unsigned long));
w = &cinfo.output_width;
h = &cinfo.output_height;
printf("%s%d%s%d%s","The dimensions are: ", &w, " by width and ", &h, " by height.\n");
printf("%s", "Standard functions are called, reading the JPEG now.\n");
while (cinfo.output_scanline < cinfo.output_height)
{
jpeg_read_scanlines(&cinfo, &ptr, 1);
ptr += 3 * cinfo.output_width;
}
printf("%s\n", "reading is finished");
image->pixels=ptr;
image->width = *w;
image->height = *h;
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
free(w); free(h); free(ptr);
return(1);
}
int main(int argc, char *argv[])
{
printf("%s","Start the damn program already.\n");
DIR *d;
struct dirent *dent;
printf("%s","directory objects are created successfully.\n");
d = opendir("./holidays");
printf("%s","Obtained the image directory.\n");
ImageData *database;
database = malloc(NUM_IMAGES * (sizeof(ImageData)));
printf("%s", "Allocated memory for database.\n");
if (d)
{
int i=0;
printf("%d%s", i,".\n");
dent = readdir(d);
while (dent != NULL)
{
char * temp = dent->d_name;
char * name = strtok(temp, ".");
char * foldur = "./holidays/";
char * path = strcat(name, ".jpg");
printf("%s\n",path);
char * currentPath = (char*)malloc(strlen(foldur)+strlen(path));
strcpy(currentPath, foldur);
printf("%s\n",currentPath);
currentPath = strcat(currentPath,name);
printf("%s\n",currentPath);
if(currentPath!=NULL)
{
printf("%s\n", "inside loop mom");
ImageData imRead;
printf("%s%d%s","Getting ready for image number ", i, "...\n");
if(READ_JPEG_FILE(currentPath, &imRead))
{
database[i] = imRead;
i++;
}
//free(imRead);
}
free(temp); free(name); free(foldur); free(path); free(currentPath);
}
closedir(d);
printf("%d%s", i, " of the 100 images are processed.\n");
}
free(database);
return 0;
}
В какой строке происходит ошибка? –
Теперь у меня есть проблема с циклом чтения – MCO
В частности, в функции read_scan_lines я вызываю его с заголовком, unsigned char * ptr. Должен ли я использовать JSAMPARRAY вместо этого? – MCO