2011-01-12 117 views
3

試圖用libjpeg從一些原始數據寫入一個jpeg文件。用libjpeg寫一個jpeg(seg故障)

它觸發分段錯誤在jpeg_start_compress()

這裏是代碼的相關部分:

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); 
} 

的問題是不符合的memcpy,它甚至不會在for循環.. 。只是在_start_compress崩潰。

如果相關,系統是Ubuntu 10.10。

+0

是否檢查`new_width`和`height`是有效的(即> 0)? – OrangeDog 2011-01-12 00:26:27

+1

事實上,這不能是整個代碼,因爲'高度'沒有聲明。 – OrangeDog 2011-01-12 00:27:54

回答

4

您需要設置一個錯誤經理:

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