美文网首页swift好东西iOS开发笔记
ios 二维码生成(带图标)以及相册识别二维码跳转

ios 二维码生成(带图标)以及相册识别二维码跳转

作者: 雪_晟 | 来源:发表于2017-09-15 18:04 被阅读893次

    关于二维码的生成,系统提供了API。

    第一步根据内容生成CIImage
    //根据url 创建CIImage
    +(CIImage *)QRFromUrl:(NSString *)urlStr{
        // 1、创建滤镜对象
        CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
        
        // 恢复滤镜的默认属性
        [filter setDefaults];
        
        // 2、设置数据
        NSString *info = urlStr;
        // 将字符串转换成
        NSData *infoData = [info dataUsingEncoding:NSUTF8StringEncoding];
        
        // 通过KVC设置滤镜inputMessage数据
        [filter setValue:infoData forKeyPath:@"inputMessage"];
        
        // 3、获得滤镜输出的图像
        CIImage *outputImage = [filter outputImage];
        
        return outputImage;
    }
    
    第二步根据CIImage生成UIImage
    /** 根据CIImage生成指定大小的UIImage */
    + (UIImage *)createUIImageFormCIImage:(CIImage *)image withSize:(CGFloat)size {
        CGRect extent = CGRectIntegral(image.extent);
        CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
        
        // 1.创建bitmap;
        size_t width = CGRectGetWidth(extent) * scale;
        size_t height = CGRectGetHeight(extent) * scale;
        CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
        CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
        CIContext *context = [CIContext contextWithOptions:nil];
        CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
        CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
        CGContextScaleCTM(bitmapRef, scale, scale);
        CGContextDrawImage(bitmapRef, extent, bitmapImage);
        
        // 2.保存bitmap到图片
        CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
        CGContextRelease(bitmapRef);
        CGImageRelease(bitmapImage);
        return [UIImage imageWithCGImage:scaledImage];
    }
    
    

    这样就可以生成简单的二维码。

    普通的二维码.png

    如果要在二维码中间加一个logo头像,我们需要给生成的二维码添加水印。

    假定已经生成了普通的二维码
    第一步:需要根据二维码图片设置生成水印图片rect
    //根据二维码图片设置生成水印图片rect 这里限制水印的图片为二维码的1/4
        CGRect waterImageRect = [self getWaterImageRectFromOutputQRImage:orginQRImage];
    
    +(CGRect)getWaterImageRectFromOutputQRImage:(UIImage *)orginQRImage{
        
         CGSize linkSize = CGSizeMake(orginQRImage.size.width / 4, orginQRImage.size.height / 4); 
        
        CGFloat linkX = (orginQRImage.size.width -linkSize.width)/2;
        CGFloat linkY = (orginQRImage.size.height -linkSize.height)/2;
    
        
        return CGRectMake(linkX, linkY, linkSize.width, linkSize.height);
    }
    
    
    第二步:根据限制的rect重新生成logo图片
    UIImage *logoImage =[[UIImage imageNamed:logoName]scaleToSize:waterImageRect.size];
    
    -(UIImage*)scaleToSize:(CGSize)size
    {
        size = CGSizeMake(size.width  , size.height );
        // 创建一个bitmap的context
        // 并把它设置成为当前正在使用的context
        UIGraphicsBeginImageContext(size);
        // 绘制改变大小的图片
        [self drawInRect:CGRectMake(0, 0, size.width , size.height )];
        // 从当前context中创建一个改变大小后的图片
        UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
        // 使当前的context出堆栈
        UIGraphicsEndImageContext();
        // 返回新的改变大小后的图片
        return scaledImage;
    }
    
    第三步:为生成的二维码添加水印图片
     //添加水印图片
        finalImage =[UIImage LX_WaterImageWithImage:orginQRImage waterImage:waterImage waterImageRect:waterImageRect];
    
    //添加水印图片
    + (UIImage *)LX_WaterImageWithImage:(UIImage *)image waterImage:(UIImage *)waterImage waterImageRect:(CGRect)rect{
        
        //1.获取图片
        
        //2.开启上下文
        UIGraphicsBeginImageContextWithOptions(image.size, NO, 0);
        //3.绘制背景图片
        [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
        //绘制水印图片到当前上下文
        [waterImage drawInRect:rect];
        
        //4.从上下文中获取新图片
        UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
        //5.关闭图形上下文
        UIGraphicsEndImageContext();
        //返回图片
        return newImage;
    
    }
    

    最后会生成如下的二维码


    logo二维码.png

    把方法封装在 分类里面,直接调用即可。

    //普通的二维码
    +(UIImage *)LX_ImageOfQRFromURL:(NSString *)urlStr codeSize:(CGFloat)codeSize;
    
    //带logo 的二维码
    +(UIImage *)LX_ImageOfQRFromURL:(NSString *)urlStr codeSize:(CGFloat)codeSize logoName:(NSString *)logoName  radius: (CGFloat)radius borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)borderColor;
    

    简单介绍一些图片裁剪处理的分类。

    1、裁剪图片自定义圆角

    + (UIImage *)LX_ClipImageWithImage:(UIImage *)image circleRect:(CGRect)rect radious:(CGFloat) radious;
    
    + (UIImage *)LX_ClipImageWithImage:(UIImage *)image circleRect:(CGRect)rect radious:(CGFloat) radious{
        //1、开启上下文
        UIGraphicsBeginImageContextWithOptions(image.size, NO, 0);
        //2、设置裁剪区域
    //    UIBezierPath * path = [UIBezierPath bezierPathWithOvalInRect:rect];
        UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radious];
        [path addClip];
        //3、绘制图片
        [image drawAtPoint:CGPointZero];
        //4、获取新图片
        UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
        //5、关闭上下文
        UIGraphicsEndImageContext();
        //6、返回新图片
        return newImage;
    }
    
    
    圆形裁剪.png

    2、圆形裁剪带边框

    //裁剪带边框的圆形图片
    + ( UIImage *)LX_ClipCircleImageWithImage:(UIImage *)image circleRect:(CGRect)rect borderWidth:(CGFloat)borderW borderColor:( UIColor *)borderColor;
    
    //裁剪带边框的圆形图片
    + (UIImage *)LX_ClipCircleImageWithImage:(UIImage *)image circleRect:(CGRect)rect borderWidth:(CGFloat)borderW borderColor:( UIColor *)borderColor{
        //1、开启上下文
        UIGraphicsBeginImageContextWithOptions(image.size, NO, 0);
        
        //2、设置边框
        UIBezierPath * path = [UIBezierPath bezierPathWithOvalInRect:rect];
        [borderColor setFill];
        [path fill];
        
        //3、设置裁剪区域
        UIBezierPath * clipPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(rect.origin.x + borderW , rect.origin.x + borderW , rect.size.width - borderW * 2, rect.size.height - borderW *2)];
        [clipPath addClip];
        
        //3、绘制图片
        [image drawAtPoint:CGPointZero];
        
        //4、获取新图片
        UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
        //5、关闭上下文
        UIGraphicsEndImageContext();
        //6、返回新图片
        return newImage;
    
    }
    
    
    圆形裁剪边框.png

    3、自定义图片圆角

    //裁剪图片自定义圆角
    + (UIImage *)LX_ClipImageWithImage:(UIImage *)image circleRect:(CGRect)rect radious:(CGFloat) radious;
    
    + (UIImage *)LX_ClipImageWithImage:(UIImage *)image circleRect:(CGRect)rect radious:(CGFloat) radious{
        //1、开启上下文
        UIGraphicsBeginImageContextWithOptions(image.size, NO, 0);
        //2、设置裁剪区域
    //    UIBezierPath * path = [UIBezierPath bezierPathWithOvalInRect:rect];
        UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radious];
        [path addClip];
        //3、绘制图片
        [image drawAtPoint:CGPointZero];
        //4、获取新图片
        UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
        //5、关闭上下文
        UIGraphicsEndImageContext();
        //6、返回新图片
        return newImage;
    }
    
    
    自定义图片裁剪圆角.png

    4、自定义图片边框圆角

    //裁剪带边框的图片 可设置圆角 边框颜色
    +(UIImage *)LX_ClipImageRadiousWithImage:(UIImage *)image circleRect:(CGRect)rect radious:(CGFloat)radious borderWith:(CGFloat)borderW borderColor:( UIColor *)borderColor;
    
    //裁剪带边框的图片 可设置圆角 边框颜色
    +(UIImage *)LX_ClipImageRadiousWithImage:(UIImage *)image circleRect:(CGRect)rect radious:(CGFloat)radious borderWith:(CGFloat)borderW borderColor:( UIColor *)borderColor{
        
       
        //1、开启上下文
        UIGraphicsBeginImageContextWithOptions(image.size, NO, 0);
        
        //2、设置边框
        
        UIBezierPath *path =[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radious];
        
        [borderColor setFill];
        
        [path fill];
        
        
        //3、设置裁剪区域
        
        
        UIBezierPath * clipPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(rect.origin.x + borderW , rect.origin.x + borderW , rect.size.width - borderW * 2, rect.size.height - borderW *2) cornerRadius:radious];
        
        [clipPath addClip];
        
        //3、绘制图片
        [image drawAtPoint:CGPointZero];
        
        //4、获取新图片
        UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
        //5、关闭上下文
        UIGraphicsEndImageContext();
        //6、返回新图片
        return newImage;
        
        
        
    }
    
    
    自定义图片边框圆角.png

    5、图片添加水印

    //添加水印图片
    + (UIImage *)LX_WaterImageWithImage:(UIImage *)image waterImage:(UIImage *)waterImage waterImageRect:(CGRect)rect;
    
    //添加水印图片
    + (UIImage *)LX_WaterImageWithImage:(UIImage *)image waterImage:(UIImage *)waterImage waterImageRect:(CGRect)rect{
        
        //1.获取图片
        
        //2.开启上下文
        UIGraphicsBeginImageContextWithOptions(image.size, NO, 0);
        //3.绘制背景图片
        [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
        //绘制水印图片到当前上下文
        [waterImage drawInRect:rect];
        
        //4.从上下文中获取新图片
        UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
        //5.关闭图形上下文
        UIGraphicsEndImageContext();
        //返回图片
        return newImage;
    
    }
    
    
    图片添加水印.png

    demo 里简单封装了下。效果图

    二维码.gif

    最后说明一下访问相册以及识别二维码进行跳转页面。这一块必须用真机测试。

    关于二维码扫描使用SGQRCode,
    相册选择选择TZImagePickerController

    替换掉博主的选择相册。

     TZImagePickerController *pickerController = [[TZImagePickerController alloc]initWithMaxImagesCount:1 delegate:self];
        
        NCWS(weakSelf);
        
        [pickerController setDidFinishPickingPhotosHandle:^(NSArray<UIImage *> *photo, NSArray *assets, BOOL isSelectOriginalPhoto){
            
            NSLog(@"%@",photo);
            
            UIImage *image = photo[0];
                   // CIDetector(CIDetector可用于人脸识别)进行图片解析,从而使我们可以便捷的从相册中获取到二维码
            // 声明一个 CIDetector,并设定识别类型 CIDetectorTypeQRCode
            CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy: CIDetectorAccuracyHigh}];
            
            // 取得识别结果
            NSArray *features = [detector featuresInImage:[CIImage imageWithCGImage:image.CGImage]];
            
            if (features.count == 0) {
                
            }else{
                for (int index = 0; index < [features count]; index ++) {
                    CIQRCodeFeature *feature = [features objectAtIndex:index];
                    NSString *resultStr = feature.messageString;
                    weakSelf.detectorString = resultStr;
                   
                }
                NSString *result = weakSelf.detectorString;
                
                    if ([result hasPrefix:@"http"]) {
                        ScanSuccessJumpVC *jumpVC = [[ScanSuccessJumpVC alloc] init];
                        jumpVC.jump_URL = result;
                        [self.navigationController pushViewController:jumpVC animated:YES];
                
                    } else {
                        ScanSuccessJumpVC *jumpVC = [[ScanSuccessJumpVC alloc] init];
                        jumpVC.jump_bar_code = result;
                        [self.navigationController pushViewController:jumpVC animated:YES];
                    }
    
                
            }
    
        }];
        [self presentViewController:pickerController animated:YES completion:nil];
    

    demo地址:二维码制作与图片处理

    相关文章

      网友评论

        本文标题:ios 二维码生成(带图标)以及相册识别二维码跳转

        本文链接:https://www.haomeiwen.com/subject/crcesxtx.html