若该文为原创文章,转载请注明原文出处

​红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)​

​​Qt开发专栏:三方库开发技术​​

上一篇:没有了

下一篇:《​​Jpeglib开发笔记(二):JpegLib编译(ubutnu)和Demo​​》


前话

        项目中抓取屏幕需要对HBITMAP图像,做同屏传输,需要进一步优化图像压缩率,减少数据传输量,使用到JpegLib库。


JpegLib介绍

        JpegLib是一个用C编写的jpeg图像压缩免费库,许多应用程序对jepg的支持都依赖于该库。


JpegLib下载

       下载地址:​https://www.ijg.org/

       点击对应文件即可下载,如下图:

      Jpeglib开发笔记(一):JpegLib库介绍、windows编译和Demo_#include


工程模板下载地址:

​​


使用VS2017编译

步骤一:下载源码

        先下载源码后解压到指定文件夹,如下图:

         Jpeglib开发笔记(一):JpegLib库介绍、windows编译和Demo_#include_02

步骤二:使用vs2017命令行

        在开始菜单中打开Vistual studio 2017名命行工具(开发应用是x86平台32位),进入源码文件夹,选下图:

         Jpeglib开发笔记(一):JpegLib库介绍、windows编译和Demo_编译jpeglib_03

步骤三:编译

        执行源码文件夹下的makefile.vc

        Jpeglib开发笔记(一):JpegLib库介绍、windows编译和Demo_编译jpeglib_04

        出现编译错误:

        Jpeglib开发笔记(一):JpegLib库介绍、windows编译和Demo_javascript_05

        提示找不到win32.mak文件,在C盘搜索这个文件名,没有发现该文件,可以直接下一个

   ​​​​

        直接将该文件放到jpeg-9c的源码文件夹下,继续编译:

        Jpeglib开发笔记(一):JpegLib库介绍、windows编译和Demo_jpeg压缩_06

        以上错误,经过摸索,解决方法是直接复制一份jconfig.vc,改变后缀变为jconfig.h,如下图:

        Jpeglib开发笔记(一):JpegLib库介绍、windows编译和Demo_javascript_07

        继续编译,编译完成:

         Jpeglib开发笔记(一):JpegLib库介绍、windows编译和Demo_jpeg压缩_08

        以上警告,可以忽略,已经生成了需要使用到的库,如下图:

         Jpeglib开发笔记(一):JpegLib库介绍、windows编译和Demo_jpeg压缩_09


模块化

        Jpeglib开发笔记(一):JpegLib库介绍、windows编译和Demo_#include_10


Demo

步骤一:建立VC++空项目

        使用vs2017建立VC空项目,如下图:

        Jpeglib开发笔记(一):JpegLib库介绍、windows编译和Demo_编译jpeglib_11

步骤二:将模块化代码考入Demo

、     Jpeglib开发笔记(一):JpegLib库介绍、windows编译和Demo_#include_12

步骤三:引入库

        将文件路径包含进入项目,将库路径包含进项目

        引入头文件(注意C++引入C),加载lib库,配置中添加头文件包含目录,配置中添加库名称,配置中添加库路径,总结如下图:

       Jpeglib开发笔记(一):JpegLib库介绍、windows编译和Demo_javascript_13

步骤四:贴入代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

extern "C" {
#include "jpeglib.h"
}

#pragma comment(lib, "libjpeg.lib")

int main(int argc, char **argv)
{
FILE *file;
char fileName[256];

int width;
int height;
struct jpeg_decompress_struct jDecompressStruct;
struct jpeg_error_mgr jErrorMgr;

memset(fileName, 0x00, sizeof(fileName));

while (1)
{
printf("please input jpeg file (input \'q\' to exit): ");
scanf("%s", fileName);
if (strcmp(fileName, "q") == 0)
{
exit(0);
}
if ((file = fopen(fileName, "rb")) == 0) {
fprintf(stderr, "can't open %s\n", fileName);
continue;
}

// 初始化并申请解码器
jDecompressStruct.err = jpeg_std_error(&jErrorMgr);
jpeg_create_decompress(&jDecompressStruct);

// 指定图片文件信息
jpeg_stdio_src(&jDecompressStruct, file);

// 读取头部信息
jpeg_read_header(&jDecompressStruct, TRUE);

// 开始解码
jpeg_start_decompress(&jDecompressStruct);

// 获取图片宽高
width = jDecompressStruct.image_width;
height = jDecompressStruct.image_height;

printf("decompress file:%s, %d x %d\n", fileName, width, height);

// 释放解码器对象
jpeg_destroy_decompress(&jDecompressStruct);

fclose(file);
}
return 0;
}

运行效果

        Jpeglib开发笔记(一):JpegLib库介绍、windows编译和Demo_jpeglib_14

        (注意:输入的文件非jpg会在jpeglib库文件中直接使应用退出,此处jpeglib.lib提供处理方法,可避免)


上一篇:没有了

下一篇:《​​Jpeglib开发笔记(二):JpegLib编译(ubutnu)和Demo​​》


若该文为原创文章,转载请注明原文出处