gpt4 book ai didi

c - 使用 jpeglib 压缩 JPEG 时出现 System.AccessViolationException

转载 作者:行者123 更新时间:2023-11-30 15:16:15 25 4
gpt4 key购买 nike

我对 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 错误行为并出现相同的错误。

写入文件时出现问题吗? Il 检查我是否有权在“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);

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

关于c - 使用 jpeglib 压缩 JPEG 时出现 System.AccessViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33163952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com