• 生成.扫描,二维码。


     

    [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. }  
  • 相关阅读:
    HDU1260DP
    HDU1114 背包
    HDU1078记忆化搜索
    HDU1024 最大m子段和
    Codeforces Round #401 (Div. 2) A,B,C,D,E
    HDU3666 差分约束
    HDU1540 区间合并
    HDU3308 线段树(区间合并)
    Codeforces Round #403 (Div. 2) B 三分 C dfs
    HDU1573 线性同余方程(解的个数)
  • 原文地址:https://www.cnblogs.com/shifu/p/5687019.html
Copyright © 2020-2023  润新知