您好,登錄后才能下訂單哦!
點擊生成按鈕,顯示二維碼:
使用微信掃一掃后,獲得如下界面:
libqrencode是一個日本人(Kentaro Fukuchi)寫的生成二維碼的跨平臺c語言庫。
官網是這里,Github在這里。
本人最喜歡的就是這種【用c寫成的、跨平臺的、功能單一的、使用方便的】庫!
IOS中Objc使用C/C++庫超方便,android下,稍微麻煩一點。
網上找的QRCodeGenerator類,由Andrew Kopanev實現。
很簡單,就一個方法,給定一個字符串,返回一個UIImage表示的二維碼圖片:
@interface QRCodeGenerator : NSObject + (UIImage *)qrImageForString:(NSString *)string p_w_picpathSize:(CGFloat)size; @end
來看一下實現的關鍵點:
+ (UIImage *)qrImageForString:(NSString *)string p_w_picpathSize:(CGFloat)size { if (![string length]) { return nil; } //第一步:通過utf字符串生成QRCode,調用的是libqrencode的核心函數 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中的坐標系是左手系,原點在左上角 //所以經過下面的平移和縮放矩陣操作后,就符合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; }
主要是注意一下第三步,空間變換。將右手系左下角原點變換到左手系統左上角的變換矩陣!!
百度百科對VCard格式的詳細說明
我們通過一個函數了解一下常用的格式(請見代碼注釋):
-(NSString*) getVCardString { NSMutableString* ret = [[NSMutableString alloc]init]; //VCard規范: //1、以BEGIN:VCARD開頭,END:VCARD結束 [ret appendString:@"BEGIN:VCARD \n"]; //2、定義了很多關鍵字,具體請參考百度百科,本例子用到了其中一些比較重要的關鍵詞 //3、一般格式為 key : value,例如下面 FN:隨風而行之青山磊落險峰行 [ret appendString:@"FN:"]; [ret appendString:@"隨風而行之青山磊落險峰行"]; [ret appendString:@"\n"]; //4、如果有子項目的話,使用;隔開,例如下面的電話TEL包含移動電話CELL和公司電話WORK或者家庭電話HOME,而且也可以是VOICE,FAX等等 [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、一個搞了我幾個小時的坑需要注意:,見到代碼中,最后都添加了"\n"符,是吧。 // 因為 如果行的長度超過了75個字符,那么必須分行 // 所以 保險期間,每一項都添加換行符 [ret appendString:@"URL:"]; [ret appendString:@"https://github.com/jackyblf"]; [ret appendString:@"\n"]; //6、自定義的關鍵字,使用X-開頭,當然也要和你手機的電話存儲程序兼容,否則你手機電話存儲程序也不認你自定義的內容 /* NSString* qq = @"47178234"; [ret appendString:@"X-QQ:"]; [ret appendString:qq]; [ret appendString:@"\n"]; */ [ret appendString:@"END:VCARD"]; return ret; }
- (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]; }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。