0517—jepglib

本文介绍了JPEGLib在VS2010中的正确编译方法,解决了“无法解析外部符号”的问题,并提供了一段用于将BMP转换为JPG的示例代码。同时,文章还讨论了直接使用摄像头缓冲区数据压缩时出现的问题。
一开始想偷懒,直接下载jepglib的一些头文件和lib文件,然后网上找了些代码,调试没通过。。

“无法解析外部的符号”问题,网上查了,也没有得到很好的解决方法;

于是,试着按部就班,编译jepglib的源代码开始:

网址:http://www.ijg.org/ 最新的时9的版本了,

解压出来以后,打开cmd运行命令:

在vc或者vs2010以下版本的:拷贝jconfig.vc文件里的内容到jconfig.h(需要自己新建),执行:“nmake /f  makefile.vc”然后就会生成libjepg.lib,就可以拿来用了。

这样编译出来的lib文件在vs2010下使用的话会有一些列的“无法解析外部符号” 的问题。。

所以,下面是vs2010里面要用的lib文件编译方法:

不用新建jconfig.h文件,直接执行命令“nmake /f makefile.vc setup-v10”,生成一个sln文件,打开它再编译得到jpeg.lib,

在自己的工程中添加头文件jpeglib.h和jmorecfg.h,如果编译不通过,链接lib库:#pragam comment(lib, "jpeg.lib")

 

//代码基本就是这样一个流程:

		/**********************
		压缩图像 将bmp存为jpg
		**********************/
		//1,申请压缩对象、错误处理器
		
		CString strJepgName = strFileName.Left(strFileName.ReverseFind('.')) + ".jpg";
		struct jpeg_compress_struct jcs;
		struct jpeg_error_mgr jem;
		jcs.err = jpeg_std_error(&jem);

		jpeg_create_compress(&jcs);

		FILE *f= fopen(strJepgName,"wb");
		if (f==NULL) 
		{
			//delete [] data;
			//delete [] pDataConv;
			return 0;
		}
		jpeg_stdio_dest(&jcs, f);

		jcs.image_width = bih.biWidth;
		jcs.image_height = bih.biHeight;

		jcs.input_components = 3;
		jcs.in_color_space = JCS_RGB;  // 24位RGB

		jpeg_set_defaults(&jcs);	

		jcs.q_scale_factor[0] = jpeg_quality_scaling(100);
		jcs.q_scale_factor[1] = jpeg_quality_scaling(100);
		// 图像采样率,默认为2 * 2
		jcs.comp_info[0].v_samp_factor = 1;
		jcs.comp_info[0].h_samp_factor = 1;

		jpeg_set_quality (&jcs, 100, true);

		
		// 设定编码jpeg压缩质量
 		//jpeg_set_quality (&jcs, 100, true);


		jpeg_start_compress(&jcs, TRUE);

		JSAMPROW row_pointer[1];			// 一行位图
		int row_stride;						// 每一行的字节数 

		row_stride = jcs.image_width*3;		//24位 
		int nAdjust = bih.biWidth*3%4;
		if (nAdjust) nAdjust = 4-nAdjust;
		// 对每一行进行压缩
		while (jcs.next_scanline < jcs.image_height) {
			row_pointer[0] = & pBuffer[(jcs.image_height-jcs.next_scanline-1) * (row_stride+nAdjust)];
			jpeg_write_scanlines(&jcs, row_pointer, 1);
		}

		jpeg_finish_compress(&jcs);

		jpeg_destroy_compress(&jcs);

		fclose(f);

		return 0;


 

代码可以运行,文件也生成了,但是。。

遗留了一个问题:

用directshow技术实现摄像头的获取和拍照功能,存储照片的时候有pBuffer参数存储了图片的内存信息,直接将这个值拿来压缩得到的图片  会有损坏,而先将这个buffer保存为bmp图片,然后打开这个图片,得到内存信息,再压缩,得到的jpg图片又是正常的。。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值