二维码开源库ZBar-windows下编译和使用
源码
下载最新Zbar源码(http://zbar.sourceforge.net/),网站的WIKI是空白的,所以只能在源码包里找使用说明了,很遗憾Windows下怎么编译没说明,只是说明了Windows安装包的使用(可能看得不够仔细,没找到),源码包里面有个VS的工程同样是用库文件的。网上搜了一下,也都是使用官网Windows安装包,然后调用安装目录的库文件的例程,直接使用源码的找不到。倒是刚好找到了一个STM32F4的版本(http://www.openedv.com/forum.php?mod=viewthread&tid=82582&page=1),按照其说明貌似是有问题,不能使用的,但能编译,至少还有些参考价值,比如需要使用到源码包里面的那些文件。源码目录如下,需要使用的文件,基本在zbar文件夹内。

移植过程
开始时使用的IDE是VS,由于平时会写一些上位机和小工具,所以第一时间想到的是VS。但经过一番折腾还是投降了。因为Zbar是用C99写的,还有用了不少GCC的语法,使用VC编译不了。于是下载了CodeBlock,下载是codeblocks-17.12mingw-setup.exe,带mingw,包含GCC和GDB,链接http://www.codeblocks.org/downloads/26。
以下是移植记录:
1: 新建Console工程
2: 复制zbar-0.10\include\zbar.h到zbar-0.10\zbar\,并且把zbar文件夹复制到工程目录
3:添加zbar-0.10\zbar\decoder和zbar-0.10\zbar\qrcode目录下的源码
4:添加zbar-0.10\zbar\目录下的config.c,decoder.c,error.c,image.c, img_scanner.c, refcnt.c. scanner.c,symbol.c
工程结构如下:

5:添加相关头文件路径,编译
报错
Zbar\zbar\config.c|24|fatal error: config.h: No such file or directory|
搜遍整个源码目录也没看到有config.h。查看了源码包根目录下INSTALL文件,config.h应该是由autoconf工具生成的,但这东西又是linux或unix下的,于是拷贝ZBar到Linux下,按照INSTALL的说明生成config.h,再添加回windows下的工程目录,
/* include/config.h. Generated from config.h.in by configure. */
/* include/config.h.in. Generated from configure.ac by autoheader. */ /* whether to build support for Code 128 symbology */
#define ENABLE_CODE128 1 /* whether to build support for Code 39 symbology */
#define ENABLE_CODE39 1 /* whether to build support for EAN symbologies */
#define ENABLE_EAN 1 /* whether to build support for Interleaved 2 of 5 symbology */
#define ENABLE_I25 1 /* whether to build support for PDF417 symbology */
#define ENABLE_PDF417 /* whether to build support for QR Code */
#define ENABLE_QRCODE 1 /* Program major version (before the '.') as a number */
#define ZBAR_VERSION_MAJOR 0 /* Program minor version (after '.') as a number */
#define ZBAR_VERSION_MINOR 10
编译。
报错
Zbar\zbar\qrcode\qrdectxt.c|9|fatal error: iconv.h: No such file or directory|
Iconv同样是linux下的东西,Windows编译Linux下的源码就是苦逼。
下载并安装libiconv-1.9.2-1.exe(http://gnuwin32.sourceforge.net/packages.html)
将安装目录下的iconv.h,libcharset.h,localcharset.h,libiconv2.dll拷贝工程目录下,并设置相关头文件和lib路径
重新编译后
报错Zbar\zbar\image.c|217|error: expected ')' before 'PRIx32'|
PRIx32是在inttypes.h定义的,包含该头文件后再编译,终于不报错了。
6:编译通过后,那怎么使用呢?查看zbar-0.10\examples目录下文件,里面是一些使用例程,最终挑选了zbar-0.10\examples\scan_image.c,将其内容复制粘贴到main.c,重新编译
报错
Zbar\main.c|3|fatal error: png.h: No such file or directory|
下载并安装libpng-1.2.37-setup.exe(http://gnuwin32.sourceforge.net/packages.html)
将安装目录下的png.h,pngconf.h,libpng12.dll拷贝工程目录下,并设置相关头文件和lib路径
重新编译
报错
png\include\png.h|477|fatal error: zlib.h: No such file or directory|
下载并安装zlib-1.2.3.exe(http://gnuwin32.sourceforge.net/packages.html)
将安装目录下的zconf.h,zlib.h,zlib1.dll拷贝工程目录下,并设置相关头文件和lib路径
重新编译。
通过。
7:将zbar-0.10\examples\barcode.png复制到工程根目录,对main.c做一下修改
屏蔽if(argc < 2) return(1);
get_data(argv[1], &width, &height, &raw);改为get_data("barcode.png", &width, &height, &raw);
重新编译运行后,窗口输出如下:

到此,ZBar基本能正常运行了。
最终的工程结构如下:

二维码开源库ZBar-windows下编译和使用的更多相关文章
- 二维码开源库zbar、zxing使用心得
首先说明我的测试场景是“识别打印在纸上的二维码”,在扫描结果中寻找二维码并进行识别,而不是直接让摄像头对着二维码扫描. zbar和zxing用的都是自己从github上clone的c++源码/接口编译 ...
- 二维码开源库ZBar-MDK STM32F429移植
前两篇文章已经实现ZBar在Windows平台下的编译和使用,本文将介绍如何把ZBar移植到STM32F429,IDE使用MDK. 1. MDK工程设置 (1)不勾选Use MicroLIB ,使用I ...
- 二维码开源库ZBar-吐槽篇
前不久在网上看到一篇文章<QR-Decoder-OV5640 二维码识别> ,是某开发板的教程.记得对应的开发板以前购买过,当初只是为了看OV5640的JPG的输出效果,结果由于公司奇葩的 ...
- 二维码开源库ZBar-实现中文解码
中文乱码 上篇<ZBar-windows下编译和使用>已经成功解析了条形码,但目标是二维码,经测试二维码中文会出现乱码.下图二维码的内容是"http123测试456", ...
- C++二维码相关库编译
一.瞎想 坐在地铁上闲来无聊,突然想到了二维码,顺手就百度了下相关的资料,目前C++二维码相关的库不多,也就zbar(开源中国上下了半天也没下载下来).zxing,不过这两个库据说都是解析二维码的,不 ...
- Android二维码开源项目zxing用例简化和生成二维码、条形码
上一篇讲到:Android二维码开源项目zxing编译,编译出来后有一个自带的測试程序:CaptureActivity比較复杂,我仅仅要是把一些不用的东西去掉,用看起来更方便,二维码和条形码的流行性自 ...
- 个性二维码开源专题<替换元素点>
基础方法:ChangeFillShape //修改填充形状 ChangeFillShape(...) // 摘要: // 修改填充形状 // // 参数: // g: // 图形画板 // // Fo ...
- 个性二维码开源专题<替换定位点>
基础方法: ChangeFillShape //修改填充形状 ChangeFillShape(...) // 摘要: // 修改填充形状 // // 参数: // g: // 图形画板 // // F ...
- 个性二维码开源专题<液化/圆角/效果>
基础方法: ChangeFillShape //修改填充形状 ChangeFillShape(...) // 摘要: // 修改填充形状 // // 参数: // g: // 图形画板 // // F ...
随机推荐
- Screen命令安装使用教程
在安装lnmp之前,我们一般先运行一下Screen程序,因为screen好像一个容器一样,把lnmp的安装过程保护了起来.以CentOS中安装lnmp为例,程序下载.编译都需要比较长的时间,如果中途遇 ...
- geotools实现多边形的合并&缓冲区
这算是第一次接触开源工具包,说实话刚开始有点不知所措,中途遇到很多问题的时候也感觉头皮发麻,不过很高兴自己还是坚持下来了. geotools就不做过多的介绍了,想总结一下如何根据开源内容做自己的项目. ...
- 使用git bash提交代码到github托管
1.首先登录到https://github.com注册Github帐号,并且创建一个repository. 或者登录到 https://git.oschina.net/注册账号,并且创建一个rep ...
- 如何使用mysql命令行
现在向大家介绍mysql命令行下,从数据库的建立到表数据的删除全过程,希望对网友有所帮助 方法/步骤 1.登陆mysql 打cmd命令终端,如果已经添加了mysql的环境变量,可以直接使用命令 mys ...
- RocketMQ-广播模式消费
Rocketmq 消费者默认是集群的方式消费的,消费者还可以用广播的模式进行消费.广播模式消费就是所有订阅同一个主题的消费者都会收到消息.代码实现上其实很简单,就是在消费端添加 consumer.se ...
- Intellij-@Override报错
1.设置 File >> Project Structure >> Project 中设置Project language level如下: 2. 设置 File > ...
- git 签出(恢复)指定文件
在项目开发中,偶尔会因为误删文件或其他原因需要从git仓库中恢复某些文件.此篇文章将介绍如何通过git从历史提交记录.分支记录恢复指定文件. 1. git checkout 说明:使用git chec ...
- scrapy_对传到items的值预处理
如何实现对值进行预处理? 对于传递进items的值,首先明白有两个动作,进和出,那就可以分别对这两个动作进行逻辑处理 #!/usr/bin/python3 # -*- coding: utf-8 - ...
- Linux指令--touch
原文出处:http://www.cnblogs.com/peida/archive/2012/10/30/2745714.html linux的touch命令不常用,一般在使用make的时候可能会用到 ...
- 函数式编程--使用lambda表达式
前面一篇博客我们已经说到了,lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口的实例.现在我们来写一段java的命令者模式来自己研究下lambda表达式的语法. 这里重复下命令者模式: ...