iOS学习-生成二维码,并保存到相册

点击二维码,将生成的二维码保存到相册(由于图片违规所以对二维码进行擦出)

UI编写就不放入文章中了,只书写主要方法,demo放在这里了

1、生成二维码

调用方法

UIImage *qrcodeImg = [self getQRCodeWithContentTxt:_textField.text codeWidth:600 picImg:[UIImage imageNamed:@"img"]];
_QRCodeImage.image = qrcodeImg;

生成二维码的函数

- (UIImage*)getQRCodeWithContentTxt:(NSString*)urlString codeWidth:(CGFloat)codeWidth picImg:(UIImage*)picImg{
    //使用名为 CIQRCodeGenerator 的过滤器创建一个CIFilter对象
    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];

    [filter setDefaults];

    NSData *data = [urlString dataUsingEncoding:NSUTF8StringEncoding];

    //通过kvo方式给一个字符串,生成二维码
    [filter setValue:data forKey:@"inputMessage"];

    //含文本信息的二维码已经生成

    CIImage *filterImg = [filter outputImage];

    CIImage *imageOri = [CIImage imageWithCGImage:[self filterQRCodeWithCIImage:filterImg codeWidth:codeWidth].CGImage];

    UIImage *img = [UIImage imageWithCIImage:imageOri];//默认二维码

    //------------------------------------------------------

    //-------对二维码增添颜色,不需要的可以跳过----------

    CIFilter* color_filter = [CIFilter filterWithName:@"CIFalseColor"];

    [color_filter setDefaults];

    [color_filter setValue:imageOri forKey:@"inputImage"];

    //设置二维码的颜色(二维码都是由2个颜色组成,可自行改变尝试效果)

    [color_filter setValue:[CIColor colorWithRed:66/255.0 green:147/255.0 blue:82/255.0] forKey:@"inputColor0"];

    [color_filter setValue:[CIColor clearColor]forKey:@"inputColor1"];

    CIImage *colorImage = [color_filter outputImage];

    img = [UIImage imageWithCIImage:colorImage];//修改颜色的二维码

    //-------对二维码增添颜色,不需要的可以跳过----------

    //------------------------------------------------------

    //开启图形上下文(会变模糊)
    //UIGraphicsBeginImageContext(img.size);
    //开启图形上下文(防止虚化模糊)
    UIGraphicsBeginImageContextWithOptions(img.size,NO,[[UIScreen mainScreen]scale]);
    //将二维码的图片画入
    [img drawInRect:CGRectMake(0, 0, img.size.width, img.size.height)];

    //------------------------------------------------------

    //-------二维码中间插入小插图,不需要的可以跳过----------

    UIImage *centerImg = picImg;

    CGFloat centerW = img.size.width*0.2;

    CGFloat centerH = centerW;

    CGFloat centerX = (img.size.width-centerW)*0.5;

    CGFloat centerY = (img.size.height-centerH)*0.5;

    [centerImg drawInRect:CGRectMake(centerX, centerY, centerW, centerH)];

    //-------二维码中间插入小插图,不需要的可以跳过----------

    //------------------------------------------------------

    //5.3获取绘制好的图片

    UIImage *finalImg = UIGraphicsGetImageFromCurrentImageContext();

    //5.4关闭图像上下文

    UIGraphicsEndImageContext();

    return finalImg;

}

- (UIImage *)filterQRCodeWithCIImage:(CIImage *)image codeWidth:(CGFloat)codeWidth{
    CGRect extent = CGRectIntegral(image.extent);
    
    CGFloat scale = MIN(codeWidth/CGRectGetWidth(extent), codeWidth/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];
}

2、添加提示框

写在UIViewController中

// 添加提示框
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Save QRCode?" message:@"The QRCode will be saved in Camera Roll album." preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *saveAction = [UIAlertAction actionWithTitle:@"Save" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    // 保存二维码图像
    [self saveQRCodeImage];
}];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil];
[alertController addAction:saveAction];
[alertController addAction:cancelAction];
[self presentViewController:alertController animated:YES completion:nil];

3、保存图片到相册

要提前info.plist文件中写入访问相册的权限,否则程序会崩溃报错

- (void)saveQRCodeImage {
    // 保存图像,需要提前在info.plist文件中写入访问相册的权限,否则会报错
//    UIImageWriteToSavedPhotosAlbum(_QRCodeView.QRCodeImage.image, nil, nil, nil);
    UIImageWriteToSavedPhotosAlbum(_QRCodeView.QRCodeImage.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
    NSString *title;
    NSString *message;
    
    if (!error) {
        title = @"Success!";
        message = @"The QRCode image saved successfully.";
    }
    else {
        title = @"Failed!";
        message = @"The QRCode image saved unsuccessfully, please try again later.";
    }
    
    // 使用alert view显示二维码保存状态
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *action = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
    [alert addAction:action];
    
    [self presentViewController:alert animated:YES completion:nil];
}

@end
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值