zbar在win7下的编译及中文乱码解决

编译起来比较麻烦,过程比较慢,需要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);
}   


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值