System.AccessViolationException 使用 jpeglib 压缩 JPEG 时

System.AccessViolationException while compressing JPEG using jpeglib

我对 jpeglib 比较陌生。我遇到以下问题。我必须将 rgb 光栅保存到 jpeg 文件中。代码:

typedef struct JpegErrorManager {
    struct jpeg_error_mgr pub;
    jmp_buf setjmp_buffer; //callback
} JpegErrorManager;

void JpegErrorExit(j_common_ptr cinfo)
{
    /* cinfo->err actually points to a jpegErrorManager struct */
    JpegErrorManager* myerr = (JpegErrorManager*)cinfo->err;

    /* Create the message */
    (*(cinfo->err->format_message)) (cinfo, jpegLastErrorMsg);

    /* Jump to the setjmp point */
    longjmp(myerr->setjmp_buffer, 1);
}

int Write24ByteRaster2JpegFile(const char *filefullpath, char* raster, int width, int heigth)
{
    struct jpeg_compress_struct info;
    //struct jpeg_error_mgr jerr;
    unsigned char *oneRowImgData;

    FILE* file = fopen(filefullpath, "wb");  
    if (!file) {
        SetError("Error when creating jpeg file");
        return SIL_ERROR;
    }

    //Overriding jpeglib standard behavior on errors by setting specific error handler
    JpegErrorManager jerr;
    info.err = jpeg_std_error(&jerr.pub);       
    jerr.pub.error_exit = JpegErrorExit;    
    if (setjmp(jerr.setjmp_buffer))         //Error "callback"
    {
        char errormsg[210];
        sprintf(errormsg, "JPEGLIB : %s", jpegLastErrorMsg);
        SetError(errormsg);

        jpeg_destroy_compress(&info);
        fclose(file);

        return SIL_ERROR;
    }

    // Compression parameters
    //info.err = jpeg_std_error(&jerr);  //> Uncomment to enable jpeglib std error behavior
    jpeg_stdio_dest(&info, file);
    info.image_width = width;
    info.image_height = heigth;
    info.input_components = 3;
    info.in_color_space = JCS_RGB;  
    jpeg_set_defaults(&info);   

    jpeg_start_compress(&info, TRUE);

    // Define an array, the representative picture of each row of data.
    int buffsz = width * info.input_components;
    oneRowImgData = (unsigned char*)malloc((size_t)buffsz);
    if (!oneRowImgData)
    {
        SetError("Memory allocation error while writing jpeg");
        return SIL_ERROR;
    }
    memset(oneRowImgData, 0, buffsz);

    JSAMPROW row_pointer[1];
    row_pointer[0] = oneRowImgData;
    for (int i = 0; i <info.image_height; ++i)
    {
        oneRowImgData[i] = i % 256; // Dummy image data
        jpeg_write_scanlines(&info, row_pointer, 1);
    }

    free(oneRowImgData);
    jpeg_finish_compress(&info);
    jpeg_destroy_compress(&info);

    fclose(file); 
    file = NULL;

    return SIL_SUCCESS;
}

调用 jpeg_stdio_dest 时出现错误 System.AccessViolationException。

我检查过: 是我的特定错误处理程序导致了问题吗? 似乎 不是来源。首先,因为我在所有其他函数(读取 jpeg)中使用了相同的错误处理程序,它工作得很好,其次,因为我试图设置回标准 jpeglib 错误行为并遇到相同的错误。

写入文件时的正确问题?我检查了我是否有权在 "filefullpath" 中指定的路径中创建/写入文件。我有。

我不知道接下来要检查什么。感谢您的帮助。

谷歌搜索,我发现 http://www.andrewewhite.net/wordpress/2008/09/02/very-simple-jpeg-writer-in-c-c/ 有一个例子:

struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr       jerr;

cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);        // <-- first create compress structure
jpeg_stdio_dest(&cinfo, outfile);

在此示例中,压缩结构是在分配输出目标之前创建的。也许这有帮助。