天天看點

zbar在win7下的編譯及中文亂碼解決

編譯起來比較麻煩,過程比較慢,需要mingw。按照搜到的資料總算成功了,不過中文亂碼問題沒解決,最後還是通過轉碼解決的。

編譯過程應該算比較有代表性的了,記錄一下留待參考。

1、安裝mingw

2、找到mingw的使用者目錄,建立檔案夾proj,我的系統是D:\MinGW\msys\1.0\home\Administrator\proj。将zbar-0.10整個檔案夾拷入。如圖

zbar在win7下的編譯及中文亂碼解決

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);
}   
           

繼續閱讀