• libjpeg安装和使用


     

    转自: http://blog.csdn.net/ice__snow/article/details/52563944 ,有几处做了一部分修改

    一、 编译

    下载地址 http://www.ijg.org/

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

    这里写图片描述

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

    这里写图片描述

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

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

    4、准备编译,我用的是VS2015命令提示符,不要选ARM的,选择 vs2015 x86 x64兼容工具命令提示符

    这里写图片描述

    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>就行了。 
    大部分照搬,细节可以看里面的英语注释,主要的几个地方修改下就行了,看下面的汉语注释:

    // 这些和错误处理有关,不用管
    struct my_error_mgr {
        struct jpeg_error_mgr pub;  /* "public" fields */
    
        jmp_buf setjmp_buffer;  /* for return to caller */
    };
    
    typedef struct my_error_mgr * my_error_ptr;
    
    METHODDEF(void) my_error_exit(j_common_ptr cinfo)
    {
        my_error_ptr myerr = (my_error_ptr)cinfo->err;
        (*cinfo->err->output_message) (cinfo);
        longjmp(myerr->setjmp_buffer, 1);
    }
    
    // 读取图像的函数
    // 我添加了一个参数,是我库里的zMatrix类对象,用于保存读取的图片数据
    GLOBAL(int) read_JPEG_file(char * filename, z::Matrix8u & img)
    {
        struct jpeg_decompress_struct cinfo;
        struct my_error_mgr jerr;
        FILE * infile;      
        JSAMPARRAY buffer;      
        int row_stride; 
    
        if ((infile = fopen(filename, "rb")) == NULL) {
            fprintf(stderr, "can't open %s
    ", filename);
            return 0;
        }
        cinfo.err = jpeg_std_error(&jerr.pub);
        jerr.pub.error_exit = my_error_exit;
        if (setjmp(jerr.setjmp_buffer)) {
            jpeg_destroy_decompress(&cinfo);
            fclose(infile);
            return 0;
        }
        jpeg_create_decompress(&cinfo);
    
        jpeg_stdio_src(&cinfo, infile);
    
        // 这个函数获取了读取图片的信息,包括图片的高和宽
        (void)jpeg_read_header(&cinfo, TRUE);
        // 在这里添加你自己的代码,获取或用户到图像信息
        img.create(cinfo.image_height, cinfo.image_width, 3);
    
        (void)jpeg_start_decompress(&cinfo);
    
        row_stride = cinfo.output_width * cinfo.output_components;
        buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, row_stride, 1);
    
        while (cinfo.output_scanline < cinfo.output_height) {
            // 一行一行的读取
            (void)jpeg_read_scanlines(&cinfo, buffer, 1);
    
            // 在这里添加代码获取到图片的像素数据
            // buffer保存了读取的当前行的数据,保存顺序是RGB
            // output_scanline是已经读取过的行数
            for (int i = 0; i < img.cols; ++i) {
                img[cinfo.output_scanline - 1][i * 3 + 2] = buffer[0][i * 3 + 0];
                img[cinfo.output_scanline - 1][i * 3 + 1] = buffer[0][i * 3 + 1];
                img[cinfo.output_scanline - 1][i * 3 + 0] = buffer[0][i * 3 + 2];
            }
        }
    
        (void)jpeg_finish_decompress(&cinfo);
        jpeg_destroy_decompress(&cinfo);
        fclose(infile);
        return 1;
    }

    代码:https://github.com/ffiirree/zMatrix/blob/master/zMatrix/zgui/zgui.cpp

    LINUX 下的安装

    1、下载在libjpeg到/usr/local/bin下

    2、./configure --enable-shared --prefix=$CONFIGURE_PREFIX
    3、make

    4、make install

    欢迎大家来我的新家看一看 3wwang个人博客-记录走过的技术之路

  • 相关阅读:
    对象流(序列化,反序列化)
    随机存取文件流(双性流)
    网络编程
    ByteArrayOutputStream小测试
    Java基础
    IO流实现GBK写入文件然后转换UTF-8
    IO流实现简单的文件的剪切
    递归
    ZKDQ--问题整理
    postman测试上传文件接口
  • 原文地址:https://www.cnblogs.com/wang985850293/p/6349399.html
Copyright © 2020-2023  润新知