在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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值