编译起来比较麻烦,过程比较慢,需要mingw。按照搜到的资料总算成功了,不过中文乱码问题没解决,最后还是通过转码解决的。
编译过程应该算比较有代表性的了,记录一下留待参考。
1、安装mingw
2、找到mingw的用户目录,建立文件夹proj,我的系统是D:\MinGW\msys\1.0\home\Administrator\proj。将zbar-0.10整个文件夹拷入。如图

3、启动msys。cd命令进入zbar目录。
4、输入自动配置命令。./configure --enable-shared --without-jpeg --without-Python --without-gtk --without-qt --without-imagemagick CPPFLAGS=-I/usr/include。这命令完全是照抄,不知道什么意思,好在直接就通过了。注意把双横杠改成单横杠,千万不要输错什么东西。
5、make命令生成。成功后会生成.lib目录,内有dll与def文件。再到vs命令行利用lib命令通过def生成lib:lib /def:aaa.def /out:bbb.lib。最好用绝对路径,否则生成的文件找起来太麻烦。OK,编译完成。
不过悲催的是按别人资料修改代码重新编译后乱码问题还是没有解决,最后通过转码完成了(编码我都用utf-8,不过以前缺省的日文dll转码也一样)。当然代码主要是抄的,按自己需要做了修改。图像的初步处理由opencv2来完成,可兼容unicode与多字节字符集。不废话,直接上代码。
#include <zbar.h>
#include <iostream>
#include <afx.h>
#include <shlwapi.h>
#include <SDKDDKVer.h>
#include <Windows.h>
#include"opencv_common.h"
#pragma once
using namespace std;
using namespace cv;
using namespace zbar;
void ConvertUtf8ToGBK(const char *strUtf8,TCHAR *szResult)
{
int len=MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, NULL,0);
wchar_t * wszGBK = new wchar_t[len];
memset(wszGBK,0,len);
MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, wszGBK, len);
#ifdef _UNICODE
_tcscpy(szResult,wszGBK);
#else
len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK=new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, wszGBK, -1, szGBK, len, NULL,NULL);
_tcscpy(szResult,szGBK);
delete[] szGBK;
#endif
delete[] wszGBK;
}
int main( int argc, char** argv )
{
zbar_image_scanner_t *scanner = zbar_image_scanner_create();
/* configure the reader */
zbar_image_scanner_set_config(scanner, ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
/* obtain image data */
int width = 0, height = 0;
const void *raw = NULL;
Mat img = cv::imread("chs.jpg");
cv::Mat imgGray ;
imgGray.create(img.size(),CV_8UC1);
cvtColor(img,imgGray,CV_BGR2GRAY);
width = img.cols;
height= img.rows;
raw = (char*)imgGray.data;
/* wrap image data */
Image image_z(width, height, "Y800", raw, width * height);
int n = zbar_scan_image(scanner, image_z); //n == 0 is failed
TCHAR szResult[255];
/* extract results */
const zbar_symbol_t *symbol = zbar_image_first_symbol(image_z);
setlocale(LC_CTYPE, "chs");
for(; symbol; symbol = zbar_symbol_next(symbol))
{
zbar_symbol_type_t typ = zbar_symbol_get_type(symbol);
const char *data = zbar_symbol_get_data(symbol);
ConvertUtf8ToGBK(data,szResult);
cout << "decoded " << typ << endl;
_putts(szResult);
}
// clean up
image_z.set_data(NULL, 0);
cout<< n <<endl;
system("pause");
return(0);
}