先簡(jiǎn)單介紹一下的 漢信碼,基本上和 QRCode 即二維碼 大差不差,可但是,二維碼 一般掃描出來(lái)是 非中文的字符串(一般為鏈接),這就是漢信碼區(qū)別于二維碼的地方,漢信碼是涵蓋中文的,而且是國(guó)家自主研發(fā)非騙經(jīng)費(fèi)項(xiàng)目,雖然沒(méi)有推廣起來(lái)但是還是很好用的。其官網(wǎng)為:http://cscode.gs1cn.org/
成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)武陟,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):028-86922220簡(jiǎn)約而不簡(jiǎn)單的網(wǎng)站,大家可以看一下,在此提供一個(gè)樣例:
其優(yōu)點(diǎn):漢字編碼能力超強(qiáng)、極強(qiáng)抗污損、抗畸變識(shí)讀能力、識(shí)讀速度快、信息密度高、糾錯(cuò)能力強(qiáng)、圖形美觀等官方這么說(shuō)的。
然后,針對(duì)不同的平臺(tái) 官方提供了不同的解決方案來(lái)方便集成,但是 所提供的繼承文檔內(nèi)容 少之又少:如下圖為 iOS客戶端即成 文檔 非常簡(jiǎn)潔:
接下來(lái) 開始結(jié)合文檔 開始集成 漢信數(shù)碼 識(shí)別
鑒于 文檔如此簡(jiǎn)潔 ok 知道了 函數(shù)需要傳入一個(gè)圖片的 usinged char 類型數(shù)據(jù)
于是乎 第一步 轉(zhuǎn)化 灰度圖片
-(UIImage*)getGrayImage:(UIImage*)sourceImage { int width = sourceImage.size.width; int height = sourceImage.size.height; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); CGContextRef context = CGBitmapContextCreate (nil, width, height, 8, // bits per component 0, colorSpace, kCGImageAlphaNone); CGColorSpaceRelease(colorSpace); if (context == NULL) { return nil; } CGContextDrawImage(context, CGRectMake(0, 0, width, height), sourceImage.CGImage); UIImage *grayImage = [UIImage p_w_picpathWithCGImage:CGBitmapContextCreateImage(context)]; CGContextRelease(context); return grayImage; }
第二步 拿到灰度圖片 轉(zhuǎn)為 一維數(shù)組數(shù)據(jù)
+ (unsigned char *) convertUIImageToBitmapRGBA8:(UIImage *) p_w_picpath { CGImageRef p_w_picpathRef = p_w_picpath.CGImage; // Create a bitmap context to draw the uip_w_picpath into CGContextRef context = [self newBitmapRGBA8ContextFromImage:p_w_picpathRef]; if(!context) { return NULL; } size_t width = CGImageGetWidth(p_w_picpathRef); size_t height = CGImageGetHeight(p_w_picpathRef); CGRect rect = CGRectMake(0, 0, width, height); // Draw p_w_picpath into the context to get the raw p_w_picpath data CGContextDrawImage(context, rect, p_w_picpathRef); // Get a pointer to the data unsigned char *bitmapData = (unsigned char *)CGBitmapContextGetData(context); // Copy the data and release the memory (return memory allocated with new) size_t bytesPerRow = CGBitmapContextGetBytesPerRow(context); size_t bufferLength = bytesPerRow * height; unsigned char *newBitmap = NULL; if(bitmapData) { newBitmap = (unsigned char *)malloc(sizeof(unsigned char) * bytesPerRow * height); if(newBitmap) { // Copy the data for(int i = 0; i < bufferLength; ++i) { newBitmap[i] = bitmapData[i]; } } free(bitmapData); } else { NSLog(@"Error getting bitmap pixel data\n"); } CGContextRelease(context); return newBitmap; }
在這里需要注意的是 對(duì)選擇的圖片 要做選景框處理 也就是需要截取只需要解碼的部分圖片 并進(jìn)行一定的體積壓縮 否則會(huì)出現(xiàn)溢出。
當(dāng)時(shí)準(zhǔn)備完畢之后 運(yùn)行 ,掃描 漢信碼 一直報(bào) 9001 錯(cuò)誤 具體什么錯(cuò)誤 官方文檔并沒(méi)有給出明確的解釋,問(wèn)題懸而未決。。。。
折磨了數(shù)周之后 仍然 未解決 ,細(xì)細(xì)想了一下 是否是 因?yàn)?nbsp;漢信碼 所提供 sdk 不支持 iOS CoreGraphics 框架的 數(shù)據(jù)輸出 識(shí)別。
于是抱著試試的態(tài)度,把目標(biāo)轉(zhuǎn)向了 opencv 這個(gè) 跨平臺(tái)的 圖片處理庫(kù);
OpenCV是一個(gè)基于BSD許可(開源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺(jué)庫(kù),可以運(yùn)行在Linux、Windows、Android和Mac OS操作系統(tǒng)上。它輕量級(jí)而且高效——由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,同時(shí)提供了Python、Ruby、MATLAB等語(yǔ)言的接口,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺(jué)方面的很多通用算法。
使用 opencv 集成
第一步 轉(zhuǎn)化 灰度圖片
CGColorSpaceRef colorSpace = CGImageGetColorSpace(p_w_picpath.CGImage); CGFloat cols = p_w_picpath.size.width; CGFloat rows = p_w_picpath.size.height; cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to data cols, // Width of bitmap rows, // Height of bitmap 8, // Bits per component cvMat.step[0], // Bytes per row colorSpace, // Colorspace kCGImageAlphaNoneSkipLast | kCGBitmapByteOrderDefault); // Bitmap info flags CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), p_w_picpath.CGImage); CGContextRelease(contextRef); CGColorSpaceRelease(colorSpace); cv::Mat matGrey; //cvtColor函數(shù)對(duì)matImage進(jìn)行灰度處理 cv::cvtColor(cvMat, matGrey, CV_BGR2GRAY);// 轉(zhuǎn)換成灰色 //使用灰度后的IplImage形式圖像,用OSTU算法算閾值:threshold IplImage grey = matGrey;
第二步從 灰度圖片中 獲取到 一維數(shù)組
unsigned char* dataImage = (unsigned char*)grey.p_w_picpathData;
第三步 調(diào)用 漢信碼 sdk
Byte vecNetMap[189*189]; try { int versionSize = preprocessImg(dataImage, srcp_w_picpath.size.width, srcp_w_picpath.size.height, vecNetMap); if (versionSize >= 23 && versionSize < 189) { Byte szInfo [7828]; int ret = DeCodeCsbyte(vecNetMap, versionSize, szInfo); if (ret > 0) { NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); NSString *str = [[NSString alloc] initWithBytes:szInfo length:ret encoding:gbkEncoding]; NSLog(@"解碼漢信-------%@",str); if (_blockHanxinResult) { _blockHanxinResult(str); } 一定要 注意 ?。?! 返回UI線程 停止掃描 否則會(huì)應(yīng)用會(huì)奔潰 dispatch_async(dispatch_get_main_queue(), ^{ [self stopScan]; }); } }else{ self.srcp_w_picpath = nil; self.hximg = nil; } } catch (int i) { }
iOS 集成 漢信碼 功能算是 告一段落。。。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
文章題目:漢信碼在iOS客戶端中的應(yīng)用和遇到的坑-創(chuàng)新互聯(lián)
本文路徑:http://muchs.cn/article18/poegp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、小程序開發(fā)、App開發(fā)、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站內(nèi)鏈、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)