漢信碼在iOS客戶端中的應(yīng)用和遇到的坑-創(chuàng)新互聯(lián)

先簡(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è)樣例:漢信碼在iOS客戶端中的應(yīng)用和遇到的坑

其優(yōu)點(diǎn):漢字編碼能力超強(qiáng)、極強(qiáng)抗污損、抗畸變識(shí)讀能力、識(shí)讀速度快、信息密度高、糾錯(cuò)能力強(qiáng)、圖形美觀等官方這么說(shuō)的。

然后,針對(duì)不同的平臺(tái) 官方提供了不同的解決方案來(lái)方便集成,但是 所提供的繼承文檔內(nèi)容 少之又少:如下圖為 iOS客戶端即成 文檔 非常簡(jiǎn)潔:

漢信碼在iOS客戶端中的應(yīng)用和遇到的坑

漢信碼在iOS客戶端中的應(yīng)用和遇到的坑

漢信碼在iOS客戶端中的應(yīng)用和遇到的坑

接下來(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)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司