jpeg_write_scanlines segfaults при использовании 12-битной libjpeg - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь преобразовать 16 бит PNG в 12 бит JPEG.Код для этого с использованием libjpeg приведен здесь.img имеет тип cv::Mat, а img_buffer имеет тип JSAMPLE*, определенный в заголовочном файле.

void png2jpeg::writejpeg(char* filename, int quality)
{

    //create a malloc for the buffer
    img_buffer = (JSAMPLE*)malloc(img.size().width*img.size().height*sizeof(JSAMPLE));

    std::memcpy(img_buffer,img.data,img.size().width*img.size().height*sizeof(JSAMPLE));

    // create a jpeg structure
    struct jpeg_compress_struct cinfo;

    // create a jpeg error manager
    struct jpeg_error_mgr jerr;

    //create a standard setup jpeg error handler
    cinfo.err = jpeg_std_error(&jerr);

    // Open the destination file
    FILE* destjpegfile;
    if((destjpegfile = fopen(filename,"wb"))==NULL)
    {
        exit(-1);
    }

    // Create a jpeg compress object
    jpeg_create_compress(&cinfo);

    // assign outfile to jpeg object
    jpeg_stdio_dest(&cinfo, destjpegfile);

    // set image specific parameters
    cinfo.image_height = img.size().height;
    cinfo.image_width = img.size().width;
    cinfo.input_components = 3;
    cinfo.in_color_space = JCS_RGB;

    // set jpeg defaults
    jpeg_set_defaults(&cinfo);

    // set jpeg quality
    jpeg_set_quality(&cinfo,quality,TRUE);

    // start jpeg compression
    jpeg_start_compress(&cinfo, TRUE);

    // Create JSAMPLE row pointer and variable to hold row width
    JSAMPROW row_pointer[1];
    int row_stride = img.size().width * 3;


    // begin the actual compression
    while (cinfo.next_scanline < cinfo.image_height)
    {
        row_pointer[0] = &img_buffer[cinfo.next_scanline * row_stride];
        (void)jpeg_write_scanlines(&cinfo,row_pointer,1);
    }

    // finish compression
    jpeg_finish_compress(&cinfo);

    // close the file
    fclose(destjpegfile);

    // destroy the jpeg object
    jpeg_destroy_compress(&cinfo);

    std::cout <<"compression successfully completed"<<std::endl;

}

Этот код работает, когда я использую 8-битный libjpeg, но с segfaultsпри выполнении строки (void)jpeg_write_scanlines(&cinfo,row_pointer,1); при использовании 12-битного libjpeg.Я не уверен, где я иду не так.

Спасибо

...