zoukankan      html  css  js  c++  java
  • LIBJPEG 安装编译,读取jpeg图像数据

    jpeg是一个国际图像压缩标准,图像的后缀一般为jpeg或者jpg。这种图片格式非常常见,还是有必要知道怎样将数据读取出来的。

    在我做的zMatrix库里,之前一直使用openCV的函数imread()读取图像,不是很方便,查过很多资料后发现,如果自己从零写一个读取jpeg的程序非常麻烦(可能水平不够吧,可以查一下都是需要什么算法),需要用到一些比较复杂的压缩算法,又因为读取图像不是重点,所以可以使用开源的库达到同样的目的,以后有空了可以自己实现。

    使用的库是libjpeg,官网链接:http://libjpeg.sourceforge.net/,下载链接:http://www.ijg.org/files/,我使用的是9b这个版本。

    接下来说一下在windows平台怎样使用这个库。


    一、 编译

    1、下载并解压,放在一个好找的目录就行:

    这里写图片描述

    2、进入jpeg-9b,找到jconfig.cv,复制并改名为jconfig.h,否则会产生无法生成jconfig的警告

    这里写图片描述

    3、找到makefile.vc这个文件,打开(随便一个文本编辑器)找到这一行

    这里写图片描述
    把路径改为win32.mk在你电脑上的路径,每个人的可能不太一样,路径差别可能不是很大,我的是C:Program Files (x86)Microsoft SDKsWindowsv7.1AIncludewin32.mak,改为
    这里写图片描述

    4、准备编译,我用的是VS2015命令提示符,不要选ARM的

    这里写图片描述

    5、进入jpeg-9b的目录,输入编译命令开始编译

    这里写图片描述
    命令:nmake -f makefile.vc

    6、编译后在目录下找到库libjpeg.lib就编译成功了。


    二、使用

    具体的使用在目录下的example.c中有,注释非常细,看了基本就会用了。这里我简单说说用法。

    1、使用配置

    有两种方法:
    第一种:添加libjpeg的头文件的路径和lib的路径到VS的工程中,项目属性页
    这里写图片描述,然后在
    这里写图片描述
    中添加libjpeg.lib
    这里写图片描述
    第二种:把用到的头文件和libjpeg.lib拷到你的工程中,只在工程里做第一种的第三步添加libjpeg.lib就行了。

    2、使用

    程序里包含头文件#include <jpeglib.h>就行了。
    大部分照搬,细节可以看里面的英语注释,主要的几个地方修改下就行了,看下面的汉语注释:

     1 // 这些和错误处理有关,不用管
     2 struct my_error_mgr {
     3     struct jpeg_error_mgr pub;  /* "public" fields */
     4 
     5     jmp_buf setjmp_buffer;  /* for return to caller */
     6 };
     7 
     8 typedef struct my_error_mgr * my_error_ptr;
     9 
    10 METHODDEF(void) my_error_exit(j_common_ptr cinfo)
    11 {
    12     my_error_ptr myerr = (my_error_ptr)cinfo->err;
    13     (*cinfo->err->output_message) (cinfo);
    14     longjmp(myerr->setjmp_buffer, 1);
    15 }
    16 
    17 // 读取图像的函数
    18 // 我添加了一个参数,是我库里的zMatrix类对象,用于保存读取的图片数据
    19 GLOBAL(int) read_JPEG_file(char * filename, z::Matrix8u & img)
    20 {
    21     struct jpeg_decompress_struct cinfo;
    22     struct my_error_mgr jerr;
    23     FILE * infile;      
    24     JSAMPARRAY buffer;      
    25     int row_stride; 
    26 
    27     if ((infile = fopen(filename, "rb")) == NULL) {
    28         fprintf(stderr, "can't open %s
    ", filename);
    29         return 0;
    30     }
    31     cinfo.err = jpeg_std_error(&jerr.pub);
    32     jerr.pub.error_exit = my_error_exit;
    33     if (setjmp(jerr.setjmp_buffer)) {
    34         jpeg_destroy_decompress(&cinfo);
    35         fclose(infile);
    36         return 0;
    37     }
    38     jpeg_create_decompress(&cinfo);
    39 
    40     jpeg_stdio_src(&cinfo, infile);
    41 
    42     // 这个函数获取了读取图片的信息,包括图片的高和宽
    43     (void)jpeg_read_header(&cinfo, TRUE);
    44     // 在这里添加你自己的代码,获取或用户到图像信息
    45     img.create(cinfo.image_height, cinfo.image_width, 3);
    46 
    47     (void)jpeg_start_decompress(&cinfo);
    48 
    49     row_stride = cinfo.output_width * cinfo.output_components;
    50     buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, row_stride, 1);
    51 
    52     while (cinfo.output_scanline < cinfo.output_height) {
    53         // 一行一行的读取
    54         (void)jpeg_read_scanlines(&cinfo, buffer, 1);
    55 
    56         // 在这里添加代码获取到图片的像素数据
    57         // buffer保存了读取的当前行的数据,保存顺序是RGB
    58         // output_scanline是已经读取过的行数
    59         for (int i = 0; i < img.cols; ++i) {
    60             img[cinfo.output_scanline - 1][i * 3 + 2] = buffer[0][i * 3 + 0];
    61             img[cinfo.output_scanline - 1][i * 3 + 1] = buffer[0][i * 3 + 1];
    62             img[cinfo.output_scanline - 1][i * 3 + 0] = buffer[0][i * 3 + 2];
    63         }
    64     }
    65 
    66     (void)jpeg_finish_decompress(&cinfo);
    67     jpeg_destroy_decompress(&cinfo);
    68     fclose(infile);
    69     return 1;
    70 }
  • 相关阅读:
    同样的请求img代码,单个html文件和项目中的html文件请求结果不一样
    CSS中A标签断字不换行问题(基础知识)
    句柄无效。 (异常来自 HRESULT:0x80070006 (E_HANDLE))
    Ext.Net 控件FileUploadField上传文件
    500内部服务器错误。你查找的资源存在问题,因而无法显示
    WebService 错误:无法加载协定为xxx的终结点配置部分,因为找到了该协定的多个终结点配置
    SyntaxError: unterminated string literal
    servlet入门
    myeclipse视图布局恢复
    JavaWEB开发入门
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13673742.html
Copyright © 2011-2022 走看看