jpg与bmp图片互转指南
一、原理:
jpg与bmp图片格式都是以rgb像素为基础的,但是jpg在bmp的rgb的基础上进行了压缩。而且存储的方式是bgr,因此,在二者转换过程中需要转换对应的格式,而且只需要的到rgb再使用libjpeg库即可进行互相转换。
二、转换工具:libjpeg库
移植jpeg库
1.下载JPEG库的源代码 http://www.ijg.org/files/ JPEG官方网站
2.jpegsrc.v9a.tar.gz 为源码文件,需要往自己的linux中安装该库
在家目录解压源码文件
cp ./jpegsrc.v9a.tar.gz /home
cd /home
tar -xvf jpegsrc.v9a.tar.gz
mkdir jpeg_lib
配置文件:
cd jpeg-9a
./configure --prefix=/home/jpeg_lib
make
make install
cd …/jpeg_lib/lib
cp ./* /lib
3.编译命令:
gcc xxx.c -o xxx -I/home/gec/jpeg_lib/include -L/home/gec/jpeg_lib/lib -ljpeg
4.当需要用到库的时候在头文件中加入:这些头文件
#include <stdio.h>
#include "jpeglib.h"
#include <setjmp.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <string.h>
三、jpeg转为bmp
利用jpeg库从jpg图片获得rgb:
//读取并转换jpeg像素点为rgb像素点
GLOBAL(int)read_JPEG_file (const char * filename)
{
//定义一个JPEG解码信息结构体
struct jpeg_decompress_struct cinfo;
//定义一个错误信息结构体
struct my_error_mgr jerr;
/* More stuff */
FILE * infile; /*定义源文件指针 标准IO的*/
JSAMPARRAY buffer; /*输出行缓冲*/
int row_stride; /*输出行缓冲的宽度 */
//打开源文件
if ((infile = fopen(filename, "rb")) == NULL)
{
fprintf(stderr, "can't open %s\n", filename);
return 0;
}
/* 第一步:初始化JPEG解码对象*/
/* 我们开始初始化错误对象*/
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = my_error_exit;
if (setjmp(jerr.setjmp_buffer))
{
jpeg_destroy_decompress(&cinfo);
fclose(infile);
return 0;
}
/*现在我们可以初始化解码对象了*/
jpeg_create_decompress(&cinfo);
/*把源文件与解码对象关联起来 */
jpeg_stdio_src(&cinfo, infile);
/*读取JPEG图片的头数据*/
(void) jpeg_read_header(&cinfo, TRUE);
/*开始解码*/
(void) jpeg_start_decompress(&cinfo);
//得到一行数据所占用的字节数
row_stride = cinfo.</