【原】VC实现二维码解析之zbar篇

来源:互联网 发布:波士顿矩阵分析京东 编辑:程序博客网 时间:2024/05/21 09:58

一直在加班搞这个该死的东东,头晕脑胀。把网上所有的方法都尝试了一遍之后还是不行,于是只能“致富靠双手,要爽由自己”了

言归正传

步骤1 下载zbar for windows

地址
http://sourceforge.jp/projects/sfnet_zbarw/

步骤2 安装zbar

选定一个指定路径进行安装,最好是纯英文的路径,中文的也能实现,但不知道会遇到什么未知的问题
安装好后在指定的路径应该能找到这样一个文件夹ZBAR,里面的内容如下:
【原】VC实现二维码解析之zbar篇 - 柠檬加冰 - 柠檬加冰的博客

步骤 3
在程序中通过system函数调用bin文件中的zbarimg.EXE,实现二维码解析功能

程序如下:

system("D:\\ZBar\\bin\\zbarimg.exe D:\\qrcodeimg\\GH1.bmp>C:\\2.txt");

注1 使用system需要加载windows.h头文件 
注2 "D:\\ZBar\\bin\\zbarimg.exe为zbarimg.EXE的绝对路径
注3 D:\\qrcodeimg\\GH1.bmp为需要解析的二维码图片
注4 >C:\\2.txt 是将二维码解析结果写入一个txt文档中,后续使用

步骤4: 解析txt文档

将txt文档中的内容根据分隔符进行解析,返回CStringArray类型的对象
//////根据指定字符分割字符串函数
CStringArray* QRDecode::DivString(CString test)
{
CStringArray* m_result = new CStringArray;
while(TRUE)
{
int index = test.Find(_T("|"));
if(index == -1)
{
m_result->Add(test);
return m_result;
}
CString test1 = test.Left(index);
m_result->Add(test1);
test = test.Right(test.GetLength()-index-1);
}
}
/////////////////////////////////根据文件路径获取字符串功能函数
CStringArray* QRDecode::GetQRData()
{
CFile file;
file.Open("C:\\2.txt",CFile::modeRead);     //打开文件,具体路径你自己的
 
char szBuff[1000] = "";
file.Read(szBuff,500);  //从文件中读500个字节的东西,读多少自己来
 
CString str = szBuff;        //这个就是你要的东西了.
CStringArray *arr;
arr = DivString(str);
file.Close();        //用完记得关闭文件.

return arr;
}


步骤5 显示到界面上
CStringArray *arr;
arr = m_qrdecode->GetQRData();
m_qrcode.SetWindowText(arr->GetAt(0));
m_qrcode2.SetWindowText(arr->GetAt(1));
m_qrcode3.SetWindowText(arr->GetAt(2));
m_qrcode4.SetWindowText(arr->GetAt(3));
m_qrcode5.SetWindowText(arr->GetAt(4));
m_qrcode6.SetWindowText(arr->GetAt(5));
m_qrcode7.SetWindowText(arr->GetAt(6));


注,这里调用dos命令窗口会显示一个黑框,去掉黑框的方法就是创建一个函数,使用creatProcess方法替代system方法

/////////////////////////替代函数如下
BOOL QRDecode::system_hide(char *CommandLine)
{

SECURITY_ATTRIBUTES   sa;     
    HANDLE   hRead,hWrite;     
  
    sa.nLength   =   sizeof(SECURITY_ATTRIBUTES);     
    sa.lpSecurityDescriptor   =   NULL;     
    sa.bInheritHandle   =   TRUE;     
    if   (!CreatePipe(&hRead,&hWrite,&sa,0))       
    {     
        return   FALSE;     
    }       
  
    STARTUPINFO   si;     
    PROCESS_INFORMATION   pi;       
    si.cb   =   sizeof(STARTUPINFO);     
    GetStartupInfo(&si);       
    si.hStdError   =   hWrite;     
    si.hStdOutput   =   hWrite;     
    si.wShowWindow   =   SW_HIDE;     
    si.dwFlags   =   STARTF_USESHOWWINDOW   |   STARTF_USESTDHANDLES;     
    //关键步骤,CreateProcess函数参数意义请查阅MSDN     
    if   (!CreateProcess(NULL, CommandLine, NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))       
    {     
        return   FALSE;     
    }     
    CloseHandle(hWrite);     
  
    char   buffer[4096]   =   {0};     
    DWORD   bytesRead;       
    while(true)       
    {     
        memset(buffer,0,strlen(buffer));  
        if(ReadFile(hRead,buffer,4095,&bytesRead,NULL)==NULL)     
            break;     
        //buffer中就是执行的结果,可以保存到文本,也可以直接输出     
        //printf(buffer);//这行注释掉就可以了     
        Sleep(100);       
    }       
    return   TRUE;     

}

///////////////////////////调用如下
system_hide("D:\\ZBar\\bin\\zbarimg.exe D:\\qrcodeimg\\GH1.bmp>C:\\2.txt");

工程文件可以在csdn下载,具体链接如下:
http://download.csdn.net/detail/u011671760/6297229

就要了一分,请兄弟们支持一下。我也是下载了很多工程才搞定的。
0 0