使用libqrencode庫制作二維碼電子名片--IOS版

1、效果圖:

點擊生成按鈕,顯示二維碼:

10年積累的成都網(wǎng)站制作、網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有澠池免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

使用微信掃一掃后,獲得如下:

2、libqrencode庫:

libqrencode是一個日本人(Kentaro Fukuchi)寫的生成二維碼的跨平臺c語言庫。
官網(wǎng)是這里,Github在這里。
本人最喜歡的就是這種【用c寫成的、跨平臺的、功能單一的、使用方便的】庫!
IOS中Objc使用C/C++庫超方便,android下,稍微麻煩一點。

3、Objc對libqrencode包裝:

網(wǎng)上找的QRCodeGenerator類,由Andrew Kopanev實現(xiàn)。
很簡單,就一個方法,給定一個字符串,返回一個UIImage表示的二維碼圖片:

@interface QRCodeGenerator : NSObject

+ (UIImage *)qrImageForString:(NSString *)string p_w_picpathSize:(CGFloat)size;

@end

來看一下實現(xiàn)的關(guān)鍵點:

+ (UIImage *)qrImageForString:(NSString *)string p_w_picpathSize:(CGFloat)size {
    if (![string length]) {
        return nil;
    }

    //第一步:通過utf字符串生成QRCode,調(diào)用的是libqrencode的核心函數(shù)
    QRcode *code = QRcode_encodeString([string UTF8String], 0, QR_ECLEVEL_L, QR_MODE_8, 1);
    if (!code) {
        return nil;
    }

    //第二步:create context
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef ctx = CGBitmapContextCreate(0, size, size, 8, size * 4, colorSpace, kCGImageAlphaPremultipliedLast);

    //第三步:空間變換
    //因為CoreGraphic的坐標系是右手系,原點在左下角
    //而UIKit中的坐標系是左手系,原點在左上角
    //所以經(jīng)過下面的平移和縮放矩陣操作后,就符合UIImage基于左手系左上角的表示
    CGAffineTransform translateTransform = CGAffineTransformMakeTranslation(0, -size);
    CGAffineTransform scaleTransform = CGAffineTransformMakeScale(1, -1);
    CGContextConcatCTM(ctx, CGAffineTransformConcat(translateTransform, scaleTransform));

    //第四步:在圖像上下文中生成二維碼位圖
    // draw QR on this context    
    [QRCodeGenerator drawQRCode:code context:ctx size:size];

    //第五步:get p_w_picpath
    CGImageRef qrCGImage = CGBitmapContextCreateImage(ctx);
    UIImage * qrImage = [UIImage p_w_picpathWithCGImage:qrCGImage];

    //第六步:some releases
    CGContextRelease(ctx);
    CGImageRelease(qrCGImage);
    CGColorSpaceRelease(colorSpace);
    QRcode_free(code);

    return qrImage;
}

主要是注意一下第三步,空間變換。將右手系左下角原點變換到左手系統(tǒng)左上角的變換矩陣!!

4、VCard格式:

百度百科對VCard格式的詳細說明

我們通過一個函數(shù)了解一下常用的格式(請見代碼注釋):

-(NSString*) getVCardString
{
    NSMutableString* ret = [[NSMutableString alloc]init];

    //VCard規(guī)范:

    //1、以BEGIN:VCARD開頭,END:VCARD結(jié)束
    [ret appendString:@"BEGIN:VCARD \n"];

    //2、定義了很多關(guān)鍵字,具體請參考百度百科,本例子用到了其中一些比較重要的關(guān)鍵詞

    //3、一般格式為 key : value,例如下面 FN:隨風而行之青山磊落險峰行
    [ret appendString:@"FN:"];
    [ret appendString:@"隨風而行之青山磊落險峰行"];
    [ret appendString:@"\n"];

    //4、如果有子項目的話,使用;隔開,例如下面的電話TEL包含移動電話CELL和公司電話WORK或者家庭電話HOME,而且也可以是VOICE,F(xiàn)AX等等
    [ret appendString:@"TEL;CELL;VOICE:"];
    [ret appendString: @"13900000000"];
    [ret appendString:@"\n"];

    [ret appendString:@"TEL;WORK;VOICE:"];
    [ret appendString:@"021-12345678"];
    [ret appendString:@"\n"];

    //同上,EMAIL也有子項目
    [ret appendString:@"EMAIL;PREF;INTERNET:"];
    [ret appendString:@"47178234@qq.com"];
    [ret appendString:@"\n"];

    //5、一個搞了我?guī)讉€小時的坑需要注意:,見到代碼中,最后都添加了"\n"符,是吧。
    //   因為 如果行的長度超過了75個字符,那么必須分行
    //   所以 保險期間,每一項都添加換行符
    [ret appendString:@"URL:"];
    [ret appendString:@"https://github.com/jackyblf"];
    [ret appendString:@"\n"];

    //6、自定義的關(guān)鍵字,使用X-開頭,當然也要和你手機的電話存儲程序兼容,否則你手機電話存儲程序也不認你自定義的內(nèi)容
    /*
    NSString* qq = @"47178234";
    [ret appendString:@"X-QQ:"];
    [ret appendString:qq];
    [ret appendString:@"\n"];
    */

    [ret appendString:@"END:VCARD"];

    return ret;
}

5、IOS中生成二維碼電子名片:

- (IBAction) forEvent:(UIEvent *)event {

    //注:必須是正方形的UIImageView,二維碼基本都是正方形的吧
    self.p_w_picpathView.p_w_picpath = [QRCodeGenerator qrImageForString:[self getVCardString] p_w_picpathSize: self.p_w_picpathView.bounds.size.width];
}

本文標題:使用libqrencode庫制作二維碼電子名片--IOS版
本文鏈接:http://muchs.cn/article4/picpie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站收錄、動態(tài)網(wǎng)站、微信小程序、網(wǎng)站維護、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)