2011-01-12 6 views
3

Versuche, eine JPEG-Datei aus einigen Rohdaten mit libjpeg zu schreiben.schreibe ein JPEG mit libjpeg (seg fault)

Es löst einen Segmentation Fault in jpeg_start_compress()

Hier ist der relevante Teil des Codes:

void write_sub_image(char *filename, int start, int end) 
{ 
    struct jpeg_compress_struct cinfo; 
    unsigned char *stride; 
    JSAMPROW row_pointer[1]; 
    unsigned long new_width = end-start; 
    int i; 
    FILE *fp; 

    stride = (unsigned char *)malloc(new_width * 3); 

    fp = fopen(filename, "w+"); 

    jpeg_create_compress(&cinfo); 

    jpeg_stdio_dest(&cinfo, fp); 

    cinfo.image_width = new_width; 
    cinfo.image_height = height; 
    cinfo.input_components = 3; 
    cinfo.in_color_space = JCS_RGB; 

    jpeg_set_defaults(&cinfo); 

    jpeg_start_compress(&cinfo, FALSE); 

    for (i=0; i<height; i++) { 
     memcpy (stride, image + (start + i * width) * 3, new_width * 3); 
     row_pointer[0] = stride; 
     jpeg_write_scanlines(&cinfo, &stride, 1); 
    } 

    jpeg_finish_compress(&cinfo); 
    jpeg_destroy_compress(&cinfo); 

    fclose(fp); 
} 

Das Problem ist nicht mit dem Memcpy ist, ist es nicht einmal für Schleife die bekommen .. stürzt einfach bei _start_compress ab.

Falls das relevant ist, ist das System Ubuntu 10.10.

+0

Haben Sie überprüft, dass '' new_width' und height' gültig sind (d> 0)? – OrangeDog

+1

In der Tat kann das nicht der ganze Code sein, da 'height' nicht deklariert wird. – OrangeDog

+0

es ist draußen erklärt, das ist Teil eines größeren Codes, sollte aber ein Stück sein, das von selbst funktionieren kann. Ich habe überprüft und new_width = 96 und Höhe = 200 in meinem Test. – Matthieu

Antwort

4

Sie benötigen einen Fehlermanager einzustellen:

struct jpeg_error_mgr jerr; 
.... 
cinfo.err = jpeg_std_error(&jerr); 
jpeg_set_defaults(&cinfo); 
.... 
+0

funktionierte perfekt ... aus irgendeinem Grund war es nicht in dem Beispiel, ich habe den Code aus. – Matthieu