簡單代碼生成與識別二維碼

二維碼的生成

百科上說二維碼最多容納 1108個字節(jié) 近似1kb

二維碼的生成原理:

是用濾鏡生成的 給濾鏡設(shè)置值即可

CIFilter *qrcFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];//二維碼生成濾鏡名稱
[qrcFilter setValue:data forKey:@"inputMessage"];//設(shè)置data數(shù)據(jù)
[qrcFilter setValue:@"H" forKey:@"inputCorrectionLevel"];
UIImage *image = [UIImage imageWithCIImage: qrcFilter.outputImage];

注釋:如何知道有哪些濾鏡,以及參數(shù)如何設(shè)置呢

 [CIFilter filterNamesInCategory:nil];//使用此方法查看所有濾鏡名稱 返回值是一個數(shù)組
  //使用此方法CIFilter *qrcFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];創(chuàng)建濾鏡之后,根據(jù)拿到的濾鏡查看相關(guān)屬性
qrcFilter.attributes;//數(shù)組 里面包含濾鏡的相關(guān)介紹和參數(shù)說明
qrcFilter.inputKeys;//數(shù)組  包含需要輸入的參數(shù)

最頂上的寫法已經(jīng)可以生成了一個二維碼,注意inputMessage的value需要二進(jìn)制數(shù)據(jù),但是生成二維碼還是比較小的.我們需要把它縮放到合適的大小.我們可以采用圖片重繪的方法.如下,注意interpolationQualityType插值類型需要寫無插值kCGInterpolationNone 要不然生成的二維碼是模糊的

-(UIImage *)ScaleToSize:(CGSize )size Withtype:(CGInterpolationQuality)interpolationQualityType{
//開啟畫布
UIGraphicsBeginImageContextWithOptions(size, NO, Scale);
CGContextSetInterpolationQuality(UIGraphicsGetCurrentContext(), interpolationQualityType);
//重新繪制
[self drawInRect:CGRectMake(0, 0, size.width, size.height)];
//獲取圖片
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
//結(jié)束繪制
UIGraphicsEndImageContext();
return result;

}

生成帶顏色的二維碼

這個仍然需要濾鏡,這個濾鏡的名字是偽顏色濾鏡.也就是說顏色是假的,不會影響二維碼存儲的真實信息.
多個濾鏡使用時,通常上一個濾鏡的結(jié)果是這個濾鏡的輸入.

       CIFilter *falseColor = [CIFilter filterWithName:@"CIFalseColor"];
    [falseColor setValue:qrcFilter.outputImage forKey:kCIInputImageKey];//上個濾鏡的輸出作為這個濾鏡的輸入
    [falseColor setValue:[CIColor colorWithCGColor:foreColor.CGColor] forKey:@"inputColor0"];//二維碼顏色
    [falseColor setValue:[CIColor colorWithCGColor:backColor.CGColor] forKey:@"inputColor1"];//底部背景色
    image = [UIImage imageWithCIImage: falseColor.outputImage];

這樣得到的圖片就是帶顏色的圖片,其中的前景色和背景色類型需要CIColor
注意UIIimage的CIImage屬性可能為空
如果需要和上一步結(jié)合使用的話,拿到濾鏡的最終輸出結(jié)果在對圖片進(jìn)行縮放.

生成帶圖片的二維碼

生成帶圖片的二維碼,只需要在生成之后的二維碼上添加一張圖片就可以了.你可以選擇繪圖,也可以選擇直接在ImageView上添加一個ImageView.但是繪圖要更高效,這里采用繪圖.

 UIImage *circleImage = [insertImage CircleImage];
    //創(chuàng)建上下文
    UIGraphicsBeginImageContext(image.size);
    //繪制二維碼
    [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
    [circleImage drawInRect:CGRectMake((image.size.width - imageSize.width)/2, (image.size.height - imageSize.height)/2, imageSize.width, imageSize.height)];
    //獲取圖像
    image = UIGraphicsGetImageFromCurrentImageContext();
    //結(jié)束上下文
    UIGraphicsEndImageContext();

注意:圖片的大小當(dāng)然是會影響二維碼信息的,因此不要太大哦

代碼整理

整理出了方法,你可以直接復(fù)制到你的項目中使用,

/**生成二維碼
百科上說二維碼最多容納 1108個字節(jié) 近似1kb
1.二維碼的內(nèi)容需要轉(zhuǎn)成為二進(jìn)制數(shù)據(jù)
2.插入圖片所占據(jù)的尺寸會影響二維碼的掃描識別
3.前景色和背景色要么都設(shè)置要么都不設(shè)置 并且前景色和背景色不能一樣或太接近
@param data 二維碼數(shù)據(jù)信息 字符串 網(wǎng)址 等需要轉(zhuǎn)成二進(jìn)制數(shù)據(jù)
@param size 二維碼的大小
@param insertImage 要插入的圖片 默認(rèn)會切圓角
@param imageSize  在二維碼中圖片顯示的尺寸,圖片過大會影響識別效果
@param foreColor 二維碼顏色
@param backColor 二維碼背景顏色
*/
+(UIImage *)createQRImageWithData:(nonnull NSData *)data QRCSize:(CGSize)size InsertImage:(UIImage *)insertImage imageSize:(CGSize)imageSize ForeColor:(UIColor *)foreColor andBackColor:(UIColor *)backColor{
  //1.二維碼生成濾鏡
  CIFilter *qrcFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
  [qrcFilter setValue:data forKey:@"inputMessage"];
  [qrcFilter setValue:@"H" forKey:@"inputCorrectionLevel"];
  UIImage *image = [UIImage imageWithCIImage: qrcFilter.outputImage];

  //2.顏色濾鏡
  if (foreColor && backColor) {
      CIFilter *falseColor = [CIFilter filterWithName:@"CIFalseColor"];
      [falseColor setValue:qrcFilter.outputImage forKey:kCIInputImageKey];
      [falseColor setValue:[CIColor colorWithCGColor:foreColor.CGColor] forKey:@"inputColor0"];//二維碼顏色
      [falseColor setValue:[CIColor colorWithCGColor:backColor.CGColor] forKey:@"inputColor1"];//底部背景色
      image = [UIImage imageWithCIImage: falseColor.outputImage];
  }
  
  //3.生成二維碼
  image = [image ScaleToSize:size Withtype:kCGInterpolationNone];
  
  //4.繪制一個頭像到二維碼上
  if (insertImage) {
      UIImage *circleImage = [insertImage CircleImage];
      //創(chuàng)建上下文
      UIGraphicsBeginImageContext(image.size);
      //繪制二維碼
      [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
      //繪制頭像 假設(shè)頭像是100 100
      [circleImage drawInRect:CGRectMake((image.size.width - imageSize.width)/2, (image.size.height - imageSize.height)/2, imageSize.width, imageSize.height)];
      //獲取圖像
      image = UIGraphicsGetImageFromCurrentImageContext();
      //結(jié)束上下文
      UIGraphicsEndImageContext();
  }
  
  return image;
}

 //這個方法,在上面有用到
   -(UIImage *)ScaleToSize:(CGSize )size Withtype:(CGInterpolationQuality)interpolationQualityType{
  //開啟畫布
  UIGraphicsBeginImageContextWithOptions(size, NO, Scale);
  CGContextSetInterpolationQuality(UIGraphicsGetCurrentContext(), interpolationQualityType);
  //重新繪制
  [self drawInRect:CGRectMake(0, 0, size.width, size.height)];
  //獲取圖片
  UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
  //結(jié)束繪制
  UIGraphicsEndImageContext();
  return result;
}

二維碼的識別

二維碼的識別需要用到二維碼檢測類
檢測圖片中的二維碼特征,檢測到返回即可,其中特征中會包含二維碼信息,這個屬性就是messageString.我封裝了一個方法,可以直接拿來用.注意這個是分類方法,self本身就是一個image

    /**
 檢測二維碼返回結(jié)果
 沒有結(jié)果返回nil
 @param detectImage 待檢測的圖片
 @return 返回的二維碼信息
 */
-(NSString *)hasQRCmessage{
    NSData *data = UIImageJPEGRepresentation(self, 1);
    CIImage *resultImage = [CIImage imageWithData:data];
    //檢測二維碼
    CIDetector *detector =  [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}];
    NSArray *resultArr =  [detector featuresInImage:resultImage];
    if (resultArr.count > 0) {
        CIQRCodeFeature *qrcFeature = resultArr.firstObject;
        return qrcFeature.messageString;
    }
    return nil;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞳购,一起剝皮案震驚了整個濱河市学赛,隨后出現(xiàn)的幾起案子年堆,更是在濱河造成了極大的恐慌盏浇,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痒蓬,死亡現(xiàn)場離奇詭異,居然都是意外死亡顾复,警方通過查閱死者的電腦和手機(jī)鲁捏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來给梅,“玉大人,你說我怎么就攤上這事∶肆瘢” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵羽德,是天一觀的道長迅办。 經(jīng)常有香客問我,道長姨夹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任磷账,我火速辦了婚禮贾虽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绰咽。我一直安慰自己地粪,他們只是感情好取募,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布矛辕。 她就那樣靜靜地躺著,像睡著了一般聊品。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陈哑,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天伸眶,我揣著相機(jī)與錄音,去河邊找鬼厘贼。 笑死,一個胖子當(dāng)著我的面吹牛毁欣,可吹牛的內(nèi)容都是我干的岳掐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼串述,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了衰腌?” 一聲冷哼從身側(cè)響起觅赊,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茉兰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坯约,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡莫鸭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年被因,在試婚紗的時候發(fā)現(xiàn)自己被綠了卿拴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡文狱,死狀恐怖缘挽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情壕曼,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布摹蘑,位于F島的核電站轧飞,受9級特大地震影響纹蝴,放射性物質(zhì)發(fā)生泄漏踪少。R本人自食惡果不足惜糠涛,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一忍捡、第九天 我趴在偏房一處隱蔽的房頂上張望集漾。 院中可真熱鬧砸脊,春花似錦、人聲如沸凌埂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孩哑。三九已至,卻和暖如春胳蛮,著一層夾襖步出監(jiān)牢的瞬間销凑,已是汗流浹背仅炊。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工茂洒, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人督勺。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像次询,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屯吊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Core Graphics Framework是一套基于C的API框架摹菠,使用了Quartz作為繪圖引擎。它提供了低...
    ShanJiJi閱讀 1,537評論 0 20
  • 奧斯卡烏龍之后蔽介,瑞恩·高斯林寂寞地站在一旁煮寡。那個眼神似曾相識。 影片中的角色和現(xiàn)實中的瞬間幸撕,如此相似∽看著別人花好...
    望京詹姆士閱讀 346評論 0 2
  • 故事起因:多人同時操作一個工作單據(jù)貌矿,保存時間有先后累铅,后保存的數(shù)據(jù)覆蓋了前面保存的數(shù)據(jù)站叼。網(wǎng)上找到文章都是講并發(fā)處理的...
    物流IT控RayLiu閱讀 3,704評論 0 5
  • 拒絕或被拒絕其實都是尷尬的尽楔,為什么尷尬投储,因為有拒絕就有靠近的一方,當(dāng)你不接受別人的好意或愛慕娇掏,其實你自己也是考慮好...
    不由得虎軀一震閱讀 229評論 0 0
  • 關(guān)注“平媽Sofia繪本故事屋”更多精彩等著你 當(dāng)《誰的牙齒》那動人心魄的一幕還在眼前揮之不去客蹋,我們還在為紅狒狒的...
    平媽繪讀書閱讀 1,862評論 0 0