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

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

参考链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。