生成.扫描,二维码。

 

[objc] view plain copy
  1. //  
  2. //  QrCodeImage.h  
  3. //  matchPlus  
  4. //  
  5. //  Created by mnn on 16/4/14.  
  6. //  Copyright © 2016年 mnn. All rights reserved.  
  7. //  
  8.   
  9. #import <UIKit/UIKit.h>  
  10. #import <CoreImage/CoreImage.h>  
  11.   
  12. @interface QrCodeImage : UIView  
  13.   
  14. /** 
  15.  *  生成带logo的二维码 
  16.  *  二维码和logo都是正方形的 
  17.  *  @param urlString     二维码中的链接 
  18.  *  @param QRCodeCGRect  二维码的CGRect 
  19.  *  @param logoImage     二维码中的logo 
  20.  *  @param logoImageSize logo的大小 
  21.  *  @param cornerRadius  logo的圆角值大小 
  22.  * 
  23.  *  @return 生成的二维码 
  24.  */  
  25. + (QrCodeImage *)creatQRCodeWithURLString:(NSString *)urlString superView:(UIView *)superView logoImage:(UIImage *)logoImage logoImageSize:(CGSize)logoImageSize logoImageWithCornerRadius:(CGFloat)cornerRadius;  
  26.   
  27. /** 
  28.  *  读取图片中的二维码 
  29.  * 
  30.  *  @param image 图片 
  31.  * 
  32.  *  @return 图片中的二维码数据集合 CIQRCodeFeature对象 
  33.  */  
  34. + (NSArray *)readQRCodeFromImage:(UIImage *)image;  
  35.   
  36. /** 
  37.  *  截图 
  38.  * 
  39.  *  @param view 需要截取的视图 
  40.  * 
  41.  *  @return 截图 图片 
  42.  */  
  43. + (UIImage *)screenShotFormView:(UIView *)view;  
  44.   
  45. @end  

 

[objc] view plain copy
  1. //  
  2. //  QrCodeImage.m  
  3. //  matchPlus  
  4. //  
  5. //  Created by mnn on 16/4/14.  
  6. //  Copyright © 2016年 mnn. All rights reserved.  
  7. //  
  8.   
  9. #import "QrCodeImage.h"  
  10.   
  11. @implementation QrCodeImage  
  12. /** 
  13.  *  生成带logo的二维码 
  14.  *  二维码和logo都是正方形的 
  15.  *  @param urlString     二维码中的链接 
  16.  *  @param QRCodeCGRect  二维码的CGRect 
  17.  *  @param logoImage     二维码中的logo 
  18.  *  @param logoImageSize logo的大小 
  19.  *  @param cornerRadius  logo的圆角值大小 
  20.  * 
  21.  *  @return 生成的二维码 
  22.  */  
  23. + (QrCodeImage *)creatQRCodeWithURLString:(NSString *)urlString superView:(UIView *)superView logoImage:(UIImage *)logoImage logoImageSize:(CGSize)logoImageSize logoImageWithCornerRadius:(CGFloat)cornerRadius{  
  24.     // 先移除子视图  
  25.     QrCodeImage *oldQRCodeView = [superView viewWithTag:123];  
  26.     [oldQRCodeView removeFromSuperview];  
  27.       
  28.     QrCodeImage *QRCodeView = [[QrCodeImage alloc] init];  
  29.     QRCodeView.tag = 123;  
  30.     QRCodeView.frame = CGRectMake(0, 0, superView.frame.size.width, superView.frame.size.height);  
  31.     CIImage *ciImage = [QRCodeView creatQRcodeWithUrlstring:urlString]; // 生成二维码  
  32.     UIImage *qrImage = [QRCodeView changeImageSizeWithCIImage:ciImage andSize:superView.frame.size.width]; // 改变二维码的大小  
  33.     if (logoImage != nil) {  
  34.         if (cornerRadius < 0) {  
  35.             cornerRadius = 0;  
  36.             NSLog(@"cornerRadius 不能小于0");  
  37.         }  
  38.         qrImage = [QRCodeView addImageToSuperImage:qrImage withSubImage:[QRCodeView imageWithCornerRadius:cornerRadius image:logoImage] andSubImagePosition:CGRectMake((superView.frame.size.width - logoImageSize.width)/2, (superView.frame.size.height - logoImageSize.height)/2, logoImageSize.width, logoImageSize.height)]; // 增加logo  
  39.     }  
  40.     QRCodeView.layer.contents = (__bridge id)qrImage.CGImage;  
  41.     [superView addSubview:QRCodeView];  
  42.     return QRCodeView;  
  43. }  
  44.   
  45.   
  46. /** 
  47.  *  根据字符串生成二维码 CIImage 对象 
  48.  * 
  49.  *  @param urlString 需要生成二维码的字符串 
  50.  * 
  51.  *  @return 生成的二维码 
  52.  */  
  53. - (CIImage *)creatQRcodeWithUrlstring:(NSString *)urlString{  
  54.     // 1.实例化二维码滤镜  
  55.     CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];  
  56.     // 2.恢复滤镜的默认属性 (因为滤镜有可能保存上一次的属性)  
  57.     [filter setDefaults];  
  58.     // 3.将字符串转换成NSdata  
  59.     NSData *data  = [urlString dataUsingEncoding:NSUTF8StringEncoding];  
  60.     // 4.通过KVO设置滤镜, 传入data, 将来滤镜就知道要通过传入的数据生成二维码  
  61.     [filter setValue:data forKey:@"inputMessage"];  
  62.     // 5.生成二维码  
  63.     CIImage *outputImage = [filter outputImage];  
  64.     return outputImage;  
  65. }  
  66. /** 
  67.  *  改变图片大小 (正方形图片) 
  68.  * 
  69.  *  @param ciImage 需要改变大小的CIImage 对象的图片 
  70.  *  @param size    图片大小 (正方形图片 只需要一个数) 
  71.  * 
  72.  *  @return 生成的目标图片 
  73.  */  
  74. - (UIImage *)changeImageSizeWithCIImage:(CIImage *)ciImage andSize:(CGFloat)size{  
  75.     CGRect extent = CGRectIntegral(ciImage.extent);  
  76.     CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));  
  77.       
  78.     // 创建bitmap;  
  79.     size_t width = CGRectGetWidth(extent) * scale;  
  80.     size_t height = CGRectGetHeight(extent) * scale;  
  81.     CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();  
  82.     CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);  
  83.     CIContext *context = [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer : @(YES)}];  
  84.     CGImageRef bitmapImage = [context createCGImage:ciImage fromRect:extent];  
  85.     CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);  
  86.     CGContextScaleCTM(bitmapRef, scale, scale);  
  87.     CGContextDrawImage(bitmapRef, extent, bitmapImage);  
  88.       
  89.     // 保存bitmap到图片  
  90.     CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);  
  91.     CGContextRelease(bitmapRef);  
  92.     CGImageRelease(bitmapImage);  
  93.       
  94.     return [UIImage imageWithCGImage:scaledImage];  
  95. }  
  96. /** 
  97.  *  图片增加水印 
  98.  * 
  99.  *  @param superImage 需要增加水印的图片 
  100.  *  @param subImage   水印图片 
  101.  *  @param posRect    水印的位置 和 水印的大小 
  102.  * 
  103.  *  @return 加水印后的新图片 
  104.  */  
  105. - (UIImage *)addImageToSuperImage:(UIImage *)superImage withSubImage:(UIImage *)subImage andSubImagePosition:(CGRect)posRect{  
  106.       
  107.     UIGraphicsBeginImageContext(superImage.size);  
  108.     [superImage drawInRect:CGRectMake(0, 0, superImage.size.width, superImage.size.height)];  
  109.     //四个参数为水印图片的位置  
  110.     [subImage drawInRect:posRect];  
  111.     UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();  
  112.     UIGraphicsEndImageContext();  
  113.     return resultingImage;  
  114. }  
  115.   
  116. /** 
  117.  *  图片设置圆角 
  118.  * 
  119.  *  @param cornerRadius 圆角值 
  120.  *  @param original     图片 
  121.  * 
  122.  *  @return 圆角图片 
  123.  */  
  124. - (UIImage *)imageWithCornerRadius:(CGFloat)cornerRadius image:(UIImage *)image  
  125. {  
  126.     CGRect frame = CGRectMake(0, 0, image.size.width, image.size.height);  
  127.     UIGraphicsBeginImageContextWithOptions(image.size, NO, 1.0);  
  128.     [[UIBezierPath bezierPathWithRoundedRect:frame  
  129.                                 cornerRadius:cornerRadius] addClip];  
  130.     // 画图  
  131.     [image drawInRect:frame];  
  132.     // 获取新的图片  
  133.     UIImage *im = UIGraphicsGetImageFromCurrentImageContext();  
  134.     UIGraphicsEndImageContext();  
  135.     return im;  
  136. }  
  137. #pragma mark - 读取图片中的二维码  
  138. /** 
  139.  *  读取图片中的二维码 
  140.  * 
  141.  *  @param image 图片 
  142.  * 
  143.  *  @return 图片中的二维码数据集合 CIQRCodeFeature对象 
  144.  */  
  145. + (NSArray *)readQRCodeFromImage:(UIImage *)image{  
  146.     // 创建一个CIImage对象  
  147.     CIImage *ciImage = [[CIImage alloc] initWithCGImage:image.CGImage options:nil];  
  148.     CIContext *context = [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer : @(YES)}]; // 软件渲染  
  149.     CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:context options:@{CIDetectorAccuracy : CIDetectorAccuracyHigh}];// 二维码识别  
  150.     // 注意这里的CIDetectorTypeQRCode  
  151.     NSArray *features = [detector featuresInImage:ciImage];  
  152.     NSLog(@"features = %@",features); // 识别后的结果集  
  153.     for (CIQRCodeFeature *feature in features) {  
  154.         NSLog(@"msg = %@",feature.messageString); // 打印二维码中的信息  
  155.     }  
  156.     return features;  
  157. }  
  158.   
  159. /** 
  160.  *  截图 
  161.  * 
  162.  *  @param view 需要截取的视图 
  163.  * 
  164.  *  @return 截图 图片 
  165.  */  
  166. + (UIImage *)screenShotFormView:(UIView *)view  
  167. {  
  168.     UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, [UIScreen mainScreen].scale);  
  169.     [view.layer renderInContext:UIGraphicsGetCurrentContext()];  
  170.     UIImage *img = UIGraphicsGetImageFromCurrentImageContext();  
  171.     UIGraphicsEndImageContext();  
  172.     return img;  
  173. }  
  174.   
  175.   
  176. /* 
  177. // Only override drawRect: if you perform custom drawing. 
  178. // An empty implementation adversely affects performance during animation. 
  179. - (void)drawRect:(CGRect)rect { 
  180.     // Drawing code 
  181. */  
  182.   
  183. @end  

 

在需要调用二维码的类加如下代码。。。

 

[objc] view plain copy
  1. /** 
  2.  *  生成二维码 
  3.  *  @param superview 放二维码的视图 
  4.  *  @param logoImage logo图片 
  5.  *  @param logoImageSize logo大小 
  6.  */  
  7. - (IBAction)btnClick:(id)sender {  
  8.     [HGDQQRCodeView creatQRCodeWithURLString:@"http://www.baidu.com" superView:self.QRView logoImage:[UIImage imageNamed:@"logo"] logoImageSize:CGSizeMake(40, 40) logoImageWithCornerRadius:0];  
  9. }  
  10. /** 
  11.  *  读取图片中的二维码 
  12.  * 
  13.  *  @param sender sender description 
  14.  */  
  15. - (IBAction)readBtnClick:(id)sender {  
  16.     // 截图  
  17.     UIImage *im = [HGDQQRCodeView screenShotFormView:self.view];  
  18.     // 读取图片中的二维码  
  19.     NSArray *array = [HGDQQRCodeView readQRCodeFromImage:im];  
  20.     // 显示二维码中的信息  
  21.     NSMutableString *str = [[NSMutableString alloc] init];  
  22.     [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOLBOOL * _Nonnull stop) {  
  23.         CIQRCodeFeature *temp = (CIQRCodeFeature *)obj;  
  24.         [str appendFormat:@"地址:%@",temp.messageString];  
  25.     }];  
  26.     self.msglabel.text = str;  
  27. }  
posted @ 2016-07-20 09:05  阳光普照大地  阅读(227)  评论(0编辑  收藏  举报