jpg其实性质和bmp的差不多,但是jpg是经过压缩的,所以在读取jpg的图像数据时,不能像bmp图像那样直接read了,而是有专门的动态库函数支持,需要利用。这个动态库中的函数其他都是按照流程来,这里需要提一下jpeg_read_scanlines这个函数,jpg其实数据也是RGB 3个字节的数据,但是他的顺序是G B R,相对于bmp是反过来的,所以这里需要注意一下。在读取jpg图像时需要用到jpeg_read_scanlines,这个函数只能一次读取一行,虽然函数说明它是支持多行读取的,但是我改参数为多行会发生段错误,这里原因不明,在程序中我用buffer申请读取一行数据需要的内存大小,读取每行数据到buffer,cinfo.output_scanline会自动加1。其他需要注意的是字节匹配,一定要把所有的数据都读到,不要忘记那三个字节和读取每列时应该乘以行的大小!
下面是实现代码:
#include "../inc/include.h"
int show_jpg(const char *pathname)
{
unsigned char *buffer;
unsigned char *jpeg_buff;
unsigned char *pre_buff;
int x = 0;
FILE *infile;
/*1.为JPEG对象分配空间并初始化*/
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
/*
将错误处理结构体对象绑定在JPEG对象上
jpeg_std_error在程序出现错误的时候自动运行exit退出