前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ijg库的使用的几点注意

ijg库的使用的几点注意

作者头像
Gxjun
发布2018-03-26 16:28:58
7750
发布2018-03-26 16:28:58
举报
文章被收录于专栏:mlml

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

使用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") //使用这条宏引入静态库即可使用:

下面是一个例子:

代码语言:javascript
复制
  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 %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 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-12-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档