if ((infile = fopen(jpg_filename, "rb")) == NULL)
{
fprintf(stderr, "open %s failed/n", jpg_filename);
return(-1);
}
/*
init jpeg decompress object error handler
*/
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
/*
* bind jpeg decompress object to infile
*/
jpeg_stdio_src(&cinfo, infile);
/*
* read jpeg header
*/
jpeg_read_header(&cinfo, TRUE);
/*
* decompress process.
* note: after jpeg_start_decompress() is called
* the dimension infomation will be known,
* so allocate memory buffer for scanline immediately
*/
jpeg_start_decompress(&cinfo);
if ((cinfo.output_width > 320) ||
(cinfo.output_height > 240)) {
printf("too large JPEG file,cannot display/n");
return (-1);
}
buffer = (unsigned char *) malloc(cinfo.output_height * cinfo.output_width * cinfo.output_components);
buffer_tmp = buffer;
y = 0;
while (cinfo.output_scanline < cinfo.output_height) {
jpeg_read_scanlines(&cinfo, &buffer_tmp, 1);
buffer_tmp += cinfo.output_width *cinfo.output_components;
// next scanlin
//printf("read %d/n",y++);
}
/*
* finish decompress, destroy decompress object
*/
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
/*
* release memory buffer
*/
//free(buffer);
/*
* close jpeg inputing file
*/
fclose(infile);
return buffer;
这篇博客详细介绍了在Linux系统中如何使用C语言进行JPEG图像解码。首先通过fopen打开文件,然后初始化JPEG解码对象并设置错误处理。接着读取JPEG头信息,判断图像尺寸是否合适。如果合适,则分配内存缓冲区,读取扫描线完成解压缩过程。最后,释放资源并关闭输入文件。
671

被折叠的 条评论
为什么被折叠?



