博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ijg库的使用的几点注意
阅读量:6041 次
发布时间:2019-06-20

本文共 4851 字,大约阅读时间需要 16 分钟。

ijg库()是用于处理jpeg解码和压缩的库,最新版本为2014发布的版本,可以在官网中下载

使用vs中个nmake 进行编译,对于这个版本的库,在编译的时候需要注意这几个点:

   1.  可以在cmd中使用命令进行编译(前提是,将 nmake的路径配置到环境变量中path下了)形如:

     设置三个变量:  

     变量名              变量值

    include             D:\Program Files\Microsoft Visual Studio 10.0\VC\include\

    lib         D:\Program Files\Microsoft Visual Studio 10.0\VC\lib\ 

    path                 D:\Program Files\Microsoft Visual Studio 10.0\VC\bin\

   设置好这些变量之后,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
2 #include
3 #include "jpeglib.h" 4 #include
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 %s\n", 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 %s\n", 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 }

转载地址:http://ksrhx.baihongyu.com/

你可能感兴趣的文章
《服务器SSH Public Key认证指南》-补充
查看>>
我的友情链接
查看>>
Java break continue return 的区别
查看>>
算法(Algorithms)第4版 练习 1.3.4
查看>>
jquery easyUI checkbox复选项获取并传后台
查看>>
浅析NopCommerce的多语言方案
查看>>
设计模式之简单工厂模式
查看>>
C++中变量的持续性、链接性和作用域详解
查看>>
2017 4月5日上午
查看>>
Google Chrome开发者工具
查看>>
第一阶段冲刺报告(一)
查看>>
使用crontab调度任务
查看>>
【转载】SQL经验小记
查看>>
zookeeper集群搭建 docker+zk集群搭建
查看>>
Vue2.5笔记:Vue的实例与生命周期
查看>>
论JVM爆炸的几种姿势及自救方法
查看>>
联合体、结构体简析
查看>>
使用throw让服务器端与客户端进行数据交互[Java]
查看>>
java反射与代理
查看>>
深度分析Java的ClassLoader机制(源码级别)
查看>>