二維碼已經在完全融入我們的生活,就在街上買個煎餅果子都能掃二維碼.今天我就二維碼的實現,來簡單闡述一下.
我這里寫三個二維碼,分別是
1 .生成普通的黑白二維碼,比較普遍
2 .還有一種是彩色二維碼,雖然顯得高大上一些,但是由于容錯率相對比較低(就是不容易讀出來),所以市面上還是比較少的.
我們需要二維碼本質是什么?
其實很簡單,是字符串.二維碼的生成就是根據字符串去生成一張圖片,僅此而已.
廢話不多說,直接代碼吧,但是兩個方法有有大部分重疊,沒有封裝,比較原始的這樣分開直接粘貼就能用.
//
// ViewController.m
// 二維碼生成
//
// Created by hhq on 16/7/15.
// Copyright ? 2016年 com.baiduniang. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) UIImageView * imageView; //普通黑白視圖
@property (nonatomic, strong) UIImageView * colorImageview; //彩色視圖
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//二維碼生成 實質: 把字符串轉變為 圖片
// 需要 coreImage框架, 已經包含在了 UIKit框架里面
[self qrCode];
[self colorQrcode];
}
//MARK:普通黑白二維碼
-(void)qrCode{
//獲取內建的所有過濾器.
// NSArray *filterArr = [CIFilter filterNamesInCategories:kCICategoryBuiltIn]; //也對
NSArray * filterArr = [CIFilter filterNamesInCategories:@[kCICategoryBuiltIn]]; //對
// NSLog(@"%@",filterArr);//所有內建過濾器,找CR...二維碼的
//二維碼過濾器
CIFilter *qrImageFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
//設置過濾器默認屬性 (老油條)
[qrImageFilter setDefaults];
//將字符串轉換成 NSdata (雖然二維碼本質上是 字符串,但是這里需要轉換,不轉換就崩潰)
NSData *qrImageData = [@"你看我帥不帥" dataUsingEncoding:NSUTF8StringEncoding];
//我們可以打印,看過濾器的 輸入屬性.這樣我們才知道給誰賦值
NSLog(@"%@",qrImageFilter.inputKeys);
/*
inputMessage, //二維碼輸入信息
inputCorrectionLevel //二維碼錯誤的等級,就是容錯率
*/
//設置過濾器的 輸入值 ,KVC賦值
[qrImageFilter setValue:qrImageData forKey:@"inputMessage"];
//取出圖片
CIImage *qrImage = [qrImageFilter outputImage];
//但是圖片 發現有的小 (27,27),我們需要放大..我們進去CIImage 內部看屬性
qrImage = [qrImage imageByApplyingTransform:CGAffineTransformMakeScale(9, 9)];
self.imageView.image = [UIImage imageWithCIImage:qrImage];
// self.imageView.image = [UIImage imageWithCIImage:qrImage scale:100.0 orientation:UIImageOrientationUp];
// //如果還想加上陰影,就在ImageView的Layer上使用下面代碼添加陰影
self.imageView.layer.shadowOffset=CGSizeMake(0, 5);//設置陰影的偏移量
self.imageView.layer.shadowRadius=1;//設置陰影的半徑
self.imageView.layer.shadowColor=[UIColor redColor].CGColor;//設置陰影的顏色為黑色
self.imageView.layer.shadowOpacity=0.3;
}
//MARK:彩色的二維碼
-(void)colorQrcode{
//二維碼的實質是 字符串, 我們生產二維碼,就是根據字符串去生產一張圖片
//獲取內建的所有過濾器.
// NSArray *filterArr = [CIFilter filterNamesInCategories:kCICategoryBuiltIn]; //也對
NSArray *filterArr = [CIFilter filterNamesInCategories:@[kCICategoryBuiltIn]]; //對
NSLog(@"%@",filterArr); //所有內建過濾器,找CR... 二維碼的
//創建二維碼過濾器
CIFilter * qrfilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
//設置默認屬性(老油條)
[qrfilter setDefaults];
//我們需要給 二維碼過期器 設置一下屬性,給它一些東西,讓它去生成圖片吧,那些屬性呢,跳進去看
NSLog(@"%@",qrfilter.inputKeys);
/*
inputMessage, //二維碼的信息
inputCorrectionLevel //二維碼的容錯率 ()到達一定值后,就不能識別二維碼了
*/
//我們需要給 二維碼 的 inputMessage 設置值, 這是私有屬性,我們 使用KVC.給其私有屬性賦值
//將字符串轉為NSData,去獲取圖片
NSData * qrimgardata = [@"http://www.baidu.com" dataUsingEncoding:NSUTF8StringEncoding];
//去獲取對應的圖片(因為測試,直接用字符串會崩潰)
[qrfilter setValue:qrimgardata forKey:@"inputMessage"];
//去獲得對應圖片 outPut
CIImage *qrImage = qrfilter.outputImage;
//圖片不清除,打印知道其 大小 為 (27,27). 進入 CIImage,看屬性,
qrImage = [qrImage imageByApplyingTransform:CGAffineTransformMakeScale(9, 9)];
//創建彩色過濾器 (彩色的用的不多)-----------------------------------------------------
CIFilter * colorFilter = [CIFilter filterWithName:@"CIFalseColor"];
//設置默認值
[colorFilter setDefaults];
//同樣打印這樣的 輸入屬性 inputKeys
NSLog(@"%@",colorFilter.inputKeys);
/*
inputImage, //輸入的圖片
inputColor0, //前景色
inputColor1 //背景色
*/
//KVC 給私有屬性賦值
[colorFilter setValue:qrImage forKey:@"inputImage"];
//需要使用 CIColor
[colorFilter setValue:[CIColor colorWithRed:1 green:0 blue:0.8] forKey:@"inputColor0"];
[colorFilter setValue:[CIColor colorWithRed:0 green:1 blue:0.4] forKey:@"inputColor1"];
//設置輸出
CIImage *colorImage = [colorFilter outputImage];
self.colorImageview.image = [UIImage imageWithCIImage:colorImage];
}
-(UIImageView *)imageView{
if(_imageView == nil){
_imageView = [[UIImageView alloc]initWithFrame:CGRectMake(50, 260, 200, 200)];
[self.view addSubview:_imageView];
}
return _imageView;
}
-(UIImageView *)colorImageview{
if (_colorImageview == nil) {
_colorImageview = [[UIImageView alloc]initWithFrame:CGRectMake(20, 20, 200, 200)];
[self.view addSubview:_colorImageview];
}
return _colorImageview;
}
@end
彩色和黑白二維碼.png