ijg库的使用的几点注意
ijg库(http://www.ijg.org/)是用于处理jpeg解码和压缩的库,最新版本为2014发布的版本,可以在官网中下载jpegsr9a.zip
使用vs中个nmake 进行编译,对于这个版本的库,在编译的时候需要注意这几个点:
1. 可以在cmd中使用命令进行编译(前提是,将 nmake的路径配置到环境变量中path下了)形如:
设置三个变量:
变量名 变量值
include D:Program FilesMicrosoft Visual Studio 10.0VCinclude
lib D:Program FilesMicrosoft Visual Studio 10.0VClib
path D:Program FilesMicrosoft Visual Studio 10.0VCbin
设置好这些变量之后,nmake就可以在cmd中使用了. 进入到ijg源码文件夹中,然后运行
输入 nmake -f makefile.vc setup-v10 编译,
(1)一般情况下,这个版本都会出现一个“无法找到文件 win32.mak”,将
#include<win32.mak>注释掉就可以了(这个注释,!include<win32.mak>)
(2)再次输入上述的命令,会出现ren jconfig.vc jconfig.h 无法找到 返回0x01的情况
这时候,新建一个jconfig.h文件,将jconfig.txt中的文件原封不动的移入到这个新建的文件中即可.
(3)再次运行上述的命令,便可以成功了!
这样就可以生成windows下的vcproject工程文件了,然后使用vs打开jpeg.pxxxx 即可运行生成静态库jpeg.lib,然后取出文件中的 这几个三个头文件
jconfig.h, jpeglib.h,jmorecfg.h 和jpeg.lib就可以了.
#progma comment("lib","jpeg.lib") //使用这条宏引入静态库即可使用:
下面是一个例子:
1 #include<Windows.h>
2 #include <stdio.h>
3 #include "jpeglib.h"
4 #include <setjmp.h>
5
6
7 //struct picture{
8 // JSAMPLE * image_buffer; /* Points to large array of R,G,B-order data */
9 // int image_height; /* Number of rows in image */
10 // int image_width; /* Number of columns in image */
11 // int quality;
12 // char *destpath;
13 //
14 //};
15
16 JSAMPLE * image_buffer; /* Points to large array of R,G,B-order data */
17 int image_height; /* Number of rows in image */
18 int image_width; /* Number of columns in image */
19 int quality;
20 char *destpath;
21
22 struct my_error_mgr {
23 struct jpeg_error_mgr pub; /* "public" fields */
24
25 jmp_buf setjmp_buffer; /* for return to caller */
26 };
27
28 typedef struct my_error_mgr * my_error_ptr;
29
30
31 METHODDEF(void)
32 my_error_exit (j_common_ptr cinfo)
33 {
34 my_error_ptr myerr = (my_error_ptr) cinfo->err;
35 (*cinfo->err->output_message) (cinfo);
36 longjmp(myerr->setjmp_buffer, 1);
37 }
38
39
40 GLOBAL(int)
41 read_JPEG_file (char * filename)
42 {
43
44 struct jpeg_decompress_struct cinfo;
45 struct my_error_mgr jerr;
46 FILE * infile; /* source file */
47 JSAMPARRAY buffer; /* Output row buffer */
48 int row_stride; /* physical row width in output buffer */
49
50 if ((infile = fopen(filename, "rb")) == NULL) {
51 fprintf(stderr, "can't open %sn", filename);
52 return 0;
53 }
54 cinfo.err = jpeg_std_error(&jerr.pub);
55 jerr.pub.error_exit = my_error_exit;
56 if (setjmp(jerr.setjmp_buffer)) {
57 jpeg_destroy_decompress(&cinfo);
58 fclose(infile);
59 return 0;
60 }
61 jpeg_create_decompress(&cinfo);
62 jpeg_stdio_src(&cinfo, infile);
63 (void) jpeg_read_header(&cinfo, TRUE);
64 (void) jpeg_start_decompress(&cinfo);
65 row_stride = cinfo.output_width * cinfo.output_components;
66 buffer = (*cinfo.mem->alloc_sarray)
67 ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
68
69
70
71 //write
72 struct jpeg_compress_struct wcinfo;
73 struct jpeg_error_mgr wjerr;
74 /* More stuff */
75 FILE * outfile; /* target file */
76 JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */
77 int wrow_stride; /* physical row width in image buffer */
78
79 wcinfo.err = jpeg_std_error(&wjerr);
80 jpeg_create_compress(&wcinfo);
81 if ((outfile = fopen(destpath, "wb")) == NULL) {
82 fprintf(stderr, "can't open %sn", destpath);
83 // exit(1);
84 }
85 jpeg_stdio_dest(&wcinfo, outfile);
86 wcinfo.image_width = image_width>cinfo.image_width?cinfo.image_width:image_width; /* image width and height, in pixels */
87 wcinfo.image_height = image_height>cinfo.image_height?cinfo.image_height:image_height;
88 wcinfo.input_components = 3; /* # of color components per pixel */
89 wcinfo.in_color_space = JCS_RGB; /* colorspace of input image */
90 jpeg_set_defaults(&wcinfo);
91 jpeg_set_quality(&wcinfo, quality, TRUE /* limit to baseline-JPEG values */);
92 jpeg_start_compress(&wcinfo, TRUE);
93 wrow_stride = image_width * 3; /* JSAMPLEs per row in image_buffer */
94
95
96
97 int cmod=cinfo.image_height/wcinfo.image_height;
98
99 while (cinfo.output_scanline < cinfo.output_height) {
100 (void) jpeg_read_scanlines(&cinfo, buffer, 1);
101 if(cinfo.output_scanline%cmod==0)
102 (void) jpeg_write_scanlines(&wcinfo,buffer, 1);
103 }
104
105
106 (void) jpeg_finish_decompress(&cinfo);
107 jpeg_destroy_decompress(&cinfo);
108 fclose(infile);
109
110
111 jpeg_finish_compress(&wcinfo);
112 jpeg_destroy_compress(&wcinfo);
113 fclose(outfile);
114 return 1;
115 }
116
117 int main(int argc, char * argd[]){
118
119 destpath="D:\jpeg_123.jpg";
120 image_height =100;
121 image_width=128;
122 quality=100;
123 read_JPEG_file("D:\123.jpg");
124 // write_JPEG_file("D:\jpeg_123.jpg",100);
125 system("pause");
126 return 0;
127 }
- Linux系统下MongoDB的简单安装与基本操作
- Go语言同步(Synchronization)
- 服务器反爬虫攻略:Apache/Nginx/PHP禁止某些User Agent抓取网站
- 【Dev Club分享】JSPatch成长之路
- Node.js新手必须知道的4个JavaScript概念
- 博客文章重新启用评论,附一键填写评论中用户信息代码生成工具
- 提升 Node.js 应用性能的 5 个技巧
- 再次扩散:Linux系统bash漏洞CVE-2014-6271仍未被彻底修复,红帽再发补丁
- SEO分享:彻底禁止搜索引擎收录非首选域名的方法
- 紧急扩散:Linux系统bash严重安全漏洞CVE-2014-6271的检测及修复方法
- 手游热更新方案xLua开源:Unity3D下Lua编程解决方案
- WordPress评论滑动/拉链解锁myQaptcha代码版及部署方法
- 修改WordPress分类目录和页面链接以斜杠/结尾,附nginx对应的301跳转设置方法
- 彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- I/O多路复用器之隐秘的角落
- 打卡群刷题总结0809——二叉树的锯齿形层次遍历
- 简单的ssm整合练手项目:汽车项目
- 在spring-boot中使用pageHelper插件
- 要深入 JavaScript,你需要掌握这 36 个概念
- mybatis-plus实现增删改查
- mybatis-plus代码生成器
- mybatis-plus逻辑删除
- mybatis-plus一些关键配置
- mybatis-plus自定义sql注入器
- k8s代码走读---kube-controller-manager
- 我们一起学一学渗透测试——黑客应该掌握的HTML基础知识(一)
- 一套漏洞组合拳接管你的账号
- 我们一起学一学渗透测试——黑客应该掌握的HTML基础知识(二)
- 我用Paddle Lite在树莓派3b+上从零开始搭建“实时表情识别”项目