2015-05-27 2 views
-2

Я работаю над проектом обработки изображений, где мне нужно написать все на 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; 
} 
+0

В какой строке происходит ошибка? –

+0

Теперь у меня есть проблема с циклом чтения – MCO

+0

В частности, в функции read_scan_lines я вызываю его с заголовком, unsigned char * ptr. Должен ли я использовать JSAMPARRAY вместо этого? – MCO

ответ

0

Держу пари, что это вызывает проблему:

длинный * ш, * ч; * w = cinfo.output_width; * h = cinfo.output_height;

+0

Да, мне нужно было malloc и получить значение переменных cinfo. Но теперь у меня проблема с циклом чтения while (cinfo.output_scanline MCO

 Смежные вопросы

  • Нет связанных вопросов^_^