gpt4 book ai didi

c++ - 使用 libjpeg 读取 .jpeg 文件时出错

转载 作者:行者123 更新时间:2023-11-30 17:44:33 28 4
gpt4 key购买 nike

当 FILE 对象成功读取输入图像文件时,我在以下代码中的函数 jpeg_read_header() 中遇到 NULL 指针异常。

#include "jpeglib.h"
#include <iostream>

using namespace std;



void decode_frame(char *filename)
{
unsigned char* raw_image;
JSAMPROW row_pointer[1];
unsigned long location = 0;

struct jpeg_error_mgr jerr;
struct jpeg_decompress_struct cinfo ;

FILE *infile = fopen(filename, "rb" );

if (infile == NULL )
{
printf("Error opening jpeg file %s\n!", filename );
return -1;
}
cinfo.err = jpeg_std_error(&jerr);

/* create decompressor */
jpeg_create_decompress(&cinfo);

/* this makes the library read from infile */
jpeg_stdio_src(&cinfo, infile );

/* read jpeg header */
jpeg_read_header(&cinfo, TRUE);

/* decompress */
jpeg_start_decompress(&cinfo);

/*allocate memory */
raw_image = (unsigned char*)malloc( cinfo.output_width*cinfo.output_height*cinfo.num_components );

/* now actually read the jpeg into the raw buffer */
row_pointer[0] = (unsigned char *)malloc( cinfo.output_width*cinfo.num_components );
/* read scanlines */
while (cinfo.output_scanline < cinfo.output_height) {
jpeg_read_scanlines( &cinfo, row_pointer, 1 );
for( int i=0; i < cinfo.image_width*cinfo.num_components;i++)
raw_image[location++] = row_pointer[0][i];
}

/* clean up */
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
fclose( infile );
free( row_pointer[0] );
}

int main(){
char *f = "Example.jpg";
decode_frame(f);
return 0;
}

调用jpeg_stdio_src(&cinfo, infile )函数后cinfo的值为:

cinfo{err=0x0020f8fc mem=0x021cb320 progress=0x00000000 ...}
progress 0x00000000 {progress_monitor=??? pass_counter=??? pass_limit=??? ...}
client_data 0xcccccccc void *
is_decompressor 1
global_state 200
src 0x021c4480 {next_input_byte=0x00000000 <Bad Ptr> bytes_in_buffer=0 init_source=0x686ccb50 ...}
image_width 0
image_height 0
num_components 0
jpeg_color_space JCS_UNKNOWN
out_color_space JCS_UNKNOWN
scale_num 0
scale_denom 0
output_gamma 0.00000000000000000
buffered_image 0
raw_data_out 0
dct_method JDCT_ISLOW

我哪里出错了?这是我第一次使用图像库。

最佳答案

全局状态200表示(根据libjpeg源代码):

#define DSTATE_START 200 /* after create_decompress */

调用jpeg_stdio_src仅用于准备解压缩器结构,即分配内部cinfo->src缓冲区并初始化其他解压缩器状态。

换句话说,JPEG 文件解析尚未开始:所以这里没有问题。

您至少需要执行jpeg_read_header以确保cinfo结构填充了所有元数据信息(image_widthimage_height jpeg_color_space 等)。如果该步骤出现问题,这可能与您的 JPEG 文件可能已损坏有关(?)。

您是否在 stderr 上看到类似 Not a JPEG file 的内容?

关于c++ - 使用 libjpeg 读取 .jpeg 文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19947440/

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