在windows/Linux下编译使用jpeglib
所需资源下载https://download.csdn.net/download/weixin_44206580/12654347
在官网下载jpeg源码
进入http://www.ijg.org/
得到文件,分别对应windows和linux
在windows下编译jpeglib
使用vs x86本机命令提示符进行编译,使用管理员权限
进入jpeg-9d目录下,编译nmake –f makefile.vc
出现----未找到”win32.mak”—的情况,将MS-SDK-master目录下的Win32.mak复制到jpeg-9d目录下
#####################################################
本地电脑中应该存在,每个人的路径都不一样
修改makefile.vc文件中win32.mak的路径,如下图
编译
出现-------不知道如何生成“jconfig.h”,将jpeg-9d目录下的jconfig.vc复制一份并改名为jconfig.h
重新编译
忽略警告
生成lib文件,新建自己的jpeglib库
路径结构如下:
在windows下使用jpeglib
引入头文件
加载lib库
在Linux下编译jpeglib
下载jpegsrc.v9d.tar.gz,并解压
tar -zxvf jpegsrc.v9d.tar.gz
进入解压后的目录,执行./configure --prefix /myFilesDisk/myProject/linux_jpeg/jpeglib
make
make install
进入编译jpeglib库存放位置
查看该目录下的结构以及文件
在Linux下使用jpeglib
项目结构
Demo
/**************************
jpeg demo
by gzf 2020-07-20
*****************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "jpeglib.h"
#include "jerror.h"
/**************************
jpg图片进行解压,然后存放到内存中
jpeg-->rgb
**********************/
char *jpeg_imageFile_decode(char *filePath, char *src_buff){
//printf("jpeg_start_decompress-----------\n");
/*图片文件*/
FILE * file;
/*图像宽高*/
long width,height;
/**图像深度**/
short depth;
/**用于存储解码之后的位图数据(RGB格式)**/
//char *src_buff;
/****/
char *ptr_src_buff;
/***用于存取一行数据***/
JSAMPARRAY raw_buffer;
/****输出缓冲区中的物理行宽度****/
int row_stride;
/***jpeg解压缩结构体,图片的所有信息都存储在结构体中***/
struct jpeg_decompress_struct cinfo;
/**定义一个标准的错误结构体,一旦程序出现错误就会调用exit()函数,退出进程**/
struct jpeg_error_mgr jpeg_err;
/**读取图片文件*/
file = fopen(filePath, "rb+");
/*if(file < 0){
printf("open file error!\n");
return -1;
}
*/
/***绑定错误处理结构对象**/
cinfo.err = jpeg_std_error(&jpeg_err);
//jpeg_err.pub.error_exit = my_error_exit;
/**建立setjmp返回上下文以供my_error_exit使用*****/
//if (setjmp(jpeg_err.setjmp_buffer)) {
/*jpeg已经发出错误信息,我们需要清理jpeg对象,关闭输入文件,然后返回***/
//jpeg_destroy_decompress(&cinfo);
//fclose(file);
//return 0;
// }
/**初始化jpeg_info结构***/
jpeg_create_decompress(&cinfo);
/**指定解压缩数据源**/
jpeg_stdio_src(&cinfo, file);
/**获取文件信息**/
jpeg_read_header(&cinfo, TRUE);
/**开始解压缩**/
jpeg_start_decompress(&cinfo);
/***图像宽高,深度**/
width = cinfo.output_width;
height = cinfo.output_height;
depth = cinfo.output_components;
//printf("width-->%d, height-->%d, depth--->%d\n", width, height, depth);
row_stride = width * depth;
/**分配位图数据空间*/
src_buff = (char *)malloc(width*height*depth);
/**清零**/
memset(src_buff, 0, sizeof(width*height*depth));
/***分配一行数据空间**/
raw_buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo,JPOOL_IMAGE, width*depth, 1);
ptr_src_buff = src_buff;
/**逐行读取位图数据**/
while(cinfo.output_scanline < height){
/***读取一行jpeg数据到raw_buffer***/
jpeg_read_scanlines(&cinfo, raw_buffer, 1);
/**将raw_buffer中的数据给src_buff***/
memcpy(ptr_src_buff, *raw_buffer, row_stride);
/***指针偏移一行***/
ptr_src_buff += row_stride;
}
/***解压缩完毕***/
jpeg_finish_decompress(&cinfo);
/***释放资源***/
jpeg_destroy_decompress(&cinfo);
/***释放buff***/
//free(src_buff);
/**关闭文件**/
fclose(file);
//printf("jpeg_finish_decompress-----------\n");
return src_buff;
}
/************************
jpg图片进行编码
rgb->jpeg
quality是个0~100之间的整数,表示压缩比率
**********************/
int jpeg_imageFile_code(char *filePath, char *src_buff, int width, int height, int quality){
//printf("jpeg_start_compress-----------\n");
/*图片文件*/
FILE * file;
/*图像宽高*/
//int width,height;
/**图像深度**/
//short depth;
int depth = 3;
/**用于存储解码之后的位图数据(RGB格式)**/
//char *src_buff;
//JSAMPLE *jsample_buff;
/***用于存取一行数据***/
JSAMPARRAY row_pointer[1];
/****输出缓冲区中的物理行宽度****/
int row_stride;
/***jpeg压缩结构体,图片的所有信息都存储在结构体中***/
struct jpeg_compress_struct cinfo;
/**定义一个标准的错误结构体,一旦程序出现错误就会调用exit()函数,退出进程**/
struct jpeg_error_mgr jpeg_err;
/***绑定错误处理结构对象**/
cinfo.err = jpeg_std_error(&jpeg_err);
/***初始化jpeg_cinfo结构体对象***/
jpeg_create_compress(&cinfo);
/**读取图片文件*/
file = fopen(filePath, "wb");
//if(file == NULL){
//printf("open file error!\n");
//free(src_buff);
//return -1;
//}
/****指定目标源***/
jpeg_stdio_dest(&cinfo, file);
/**指定图像宽高,深度,色彩空间***/
cinfo.image_width = width;
cinfo.image_height = height;
cinfo.input_components = depth;
cinfo.in_color_space =JCS_RGB;
//cinfo.num_components = depth;
//cinfo.data_precision = 8;
/**设置jpeg默认值**/
jpeg_set_defaults(&cinfo);
/**设置图片质量***/
jpeg_set_quality(&cinfo, quality, TRUE);
/***jpeg开始压缩***/
jpeg_start_compress(&cinfo, TRUE);
row_stride = width * depth;
/**逐行写入位图数据**/
while(cinfo.next_scanline < cinfo.image_height){
row_pointer[0] = &src_buff[cinfo.next_scanline * row_stride];
jpeg_write_scanlines(&cinfo, row_pointer, 1);
/*
row_pointer = (JSAMPROW)src_buff + cinfo.next_scanline*width*3;
printf("row_pointer\n");
jpeg_write_scanlines (&cinfo, row_pointer, 1);
printf("jpeg_write_scanlines\n");
*/
}
/**图像压缩结束**/
jpeg_finish_compress(&cinfo);
/**关闭文件***/
fclose(file);
/***销毁图像压缩***/
jpeg_destroy_compress(&cinfo);
//printf("jpeg_finish_compress-----------\n");
return 0;
}
int main(int argc, char *argv[]){
printf("hello jpeglib.\n");
/**jpeg解压缩测试***/
char *image_in = "1080P.jpg";
char *image_out = "1080P_60.jpg";
/***quality的值越大,图片数据量越大越清晰,原来为60**/
int quality = 60;
int width = 1920;
int height = 1080;
//sprintf(image_out, "test%d*%d_%d.jpg", width, height, quality);
//printf("image_out---> %s\n", image_out);
char *buff;
/**jpg图片进行解码***/
buff = jpeg_imageFile_decode(image_in, buff);
/**jpg图片进行编码***/
jpeg_imageFile_code(image_out, buff, width, height, quality);
/**释放内存**/
free(buff);
return 0;
}