我有一些使用libjpeg解码内存中的jpeg图像的代码,但是当输入数据损坏时,它有时会崩溃。我并不是特别熟悉libjpeg-我只是稍微修改了一些复制和粘贴的代码:)因此,我想知道如何让它报告错误或其他东西而不是崩溃,这样我就可以跳过坏图像并继续处理下一个...
这是我的代码:
我有一个这样的
以下是当程序崩溃时的输出示例。这些日志信息不是来自我的代码 - libjpeg 库本身必须打印这些内容。
请注意,
std::vector<unsigned char> m_jpegBuffer;
和这个方法:const IplImage* JpegImageSerializer::getImage()
{
int offset, row_stride;
JSAMPROW rowptr[1];
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
memset(&cinfo, 0, sizeof(cinfo));
memset(&jerr, 0, sizeof(jerr));
// Initialize the JPEG decompression object with default error handling
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
#ifdef NEED_SIGNAL_CATCHER
enable_signal_catcher((j_common_ptr) &cinfo); // Now safe to enable signal catcher
#endif
jpeg_mem_src(&cinfo, &this->m_jpegBuffer[0], this->m_jpegBuffer.size()); // Specify data source for decompression
jpeg_read_header(&cinfo, TRUE); // Read file header, set default decompression parameters
jpeg_start_decompress(&cinfo); // Start decompressor
IplImage* pImage = cvCreateImage(cvSize(cinfo.image_width, cinfo.image_height),
IPL_DEPTH_8U, 3);
// Process data
offset = 0;
row_stride = cinfo.image_width * 3;
while(cinfo.output_scanline < cinfo.output_height)
{
rowptr[0] = (JSAMPROW) &pImage->imageData[offset * row_stride];
jpeg_read_scanlines(&cinfo, rowptr, 1);
++offset;
}
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
return pImage;
}
以下是当程序崩溃时的输出示例。这些日志信息不是来自我的代码 - libjpeg 库本身必须打印这些内容。
Premature end of JPEG file
Premature end of JPEG file
Corrupt JPEG data: premature end of data segment
Unsupported marker type 0xaf
Premature end of JPEG file
Premature end of JPEG file
Premature end of JPEG file
Premature end of JPEG file
Premature end of JPEG file
Corrupt JPEG data: premature end of data segment
Invalid JPEG file structure: two SOI markers
请注意,
Premature end of JPEG file
并不会导致程序崩溃,只会在生成的图像右下角留下一些瑕疵……这对于我的需求来说还是可以接受的。但是最后两行出现的时候,程序似乎就要崩溃了。