-
- #import <UIKit/UIKit.h>
- #import <CoreImage/CoreImage.h>
-
- @interface QrCodeImage : UIView
-
- + (QrCodeImage *)creatQRCodeWithURLString:(NSString *)urlString superView:(UIView *)superView logoImage:(UIImage *)logoImage logoImageSize:(CGSize)logoImageSize logoImageWithCornerRadius:(CGFloat)cornerRadius;
-
- + (NSArray *)readQRCodeFromImage:(UIImage *)image;
-
- + (UIImage *)screenShotFormView:(UIView *)view;
-
- @end
-
- #import "QrCodeImage.h"
-
- @implementation QrCodeImage
- + (QrCodeImage *)creatQRCodeWithURLString:(NSString *)urlString superView:(UIView *)superView logoImage:(UIImage *)logoImage logoImageSize:(CGSize)logoImageSize logoImageWithCornerRadius:(CGFloat)cornerRadius{
-
- QrCodeImage *oldQRCodeView = [superView viewWithTag:123];
- [oldQRCodeView removeFromSuperview];
-
- QrCodeImage *QRCodeView = [[QrCodeImage alloc] init];
- QRCodeView.tag = 123;
- QRCodeView.frame = CGRectMake(0, 0, superView.frame.size.width, superView.frame.size.height);
- CIImage *ciImage = [QRCodeView creatQRcodeWithUrlstring:urlString];
- UIImage *qrImage = [QRCodeView changeImageSizeWithCIImage:ciImage andSize:superView.frame.size.width];
- if (logoImage != nil) {
- if (cornerRadius < 0) {
- cornerRadius = 0;
- NSLog(@"cornerRadius 不能小于0");
- }
- 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)];
- }
- QRCodeView.layer.contents = (__bridge id)qrImage.CGImage;
- [superView addSubview:QRCodeView];
- return QRCodeView;
- }
-
-
- - (CIImage *)creatQRcodeWithUrlstring:(NSString *)urlString{
-
- CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
-
- [filter setDefaults];
-
- NSData *data = [urlString dataUsingEncoding:NSUTF8StringEncoding];
-
- [filter setValue:data forKey:@"inputMessage"];
-
- CIImage *outputImage = [filter outputImage];
- return outputImage;
- }
- - (UIImage *)changeImageSizeWithCIImage:(CIImage *)ciImage andSize:(CGFloat)size{
- CGRect extent = CGRectIntegral(ciImage.extent);
- CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
-
-
- 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:@{kCIContextUseSoftwareRenderer : @(YES)}];
- CGImageRef bitmapImage = [context createCGImage:ciImage fromRect:extent];
- CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
- CGContextScaleCTM(bitmapRef, scale, scale);
- CGContextDrawImage(bitmapRef, extent, bitmapImage);
-
-
- CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
- CGContextRelease(bitmapRef);
- CGImageRelease(bitmapImage);
-
- return [UIImage imageWithCGImage:scaledImage];
- }
- - (UIImage *)addImageToSuperImage:(UIImage *)superImage withSubImage:(UIImage *)subImage andSubImagePosition:(CGRect)posRect{
-
- UIGraphicsBeginImageContext(superImage.size);
- [superImage drawInRect:CGRectMake(0, 0, superImage.size.width, superImage.size.height)];
-
- [subImage drawInRect:posRect];
- UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return resultingImage;
- }
-
- - (UIImage *)imageWithCornerRadius:(CGFloat)cornerRadius image:(UIImage *)image
- {
- CGRect frame = CGRectMake(0, 0, image.size.width, image.size.height);
- UIGraphicsBeginImageContextWithOptions(image.size, NO, 1.0);
- [[UIBezierPath bezierPathWithRoundedRect:frame
- cornerRadius:cornerRadius] addClip];
-
- [image drawInRect:frame];
-
- UIImage *im = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return im;
- }
- #pragma mark - 读取图片中的二维码
- + (NSArray *)readQRCodeFromImage:(UIImage *)image{
-
- CIImage *ciImage = [[CIImage alloc] initWithCGImage:image.CGImage options:nil];
- CIContext *context = [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer : @(YES)}];
- CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:context options:@{CIDetectorAccuracy : CIDetectorAccuracyHigh}];
-
- NSArray *features = [detector featuresInImage:ciImage];
- NSLog(@"features = %@",features);
- for (CIQRCodeFeature *feature in features) {
- NSLog(@"msg = %@",feature.messageString);
- }
- return features;
- }
-
- + (UIImage *)screenShotFormView:(UIView *)view
- {
- UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, [UIScreen mainScreen].scale);
- [view.layer renderInContext:UIGraphicsGetCurrentContext()];
- UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return img;
- }
-
-
-
- @end
在需要调用二维码的类加如下代码。。。
- - (IBAction)btnClick:(id)sender {
- [HGDQQRCodeView creatQRCodeWithURLString:@"http://www.baidu.com" superView:self.QRView logoImage:[UIImage imageNamed:@"logo"] logoImageSize:CGSizeMake(40, 40) logoImageWithCornerRadius:0];
- }
- - (IBAction)readBtnClick:(id)sender {
-
- UIImage *im = [HGDQQRCodeView screenShotFormView:self.view];
-
- NSArray *array = [HGDQQRCodeView readQRCodeFromImage:im];
-
- NSMutableString *str = [[NSMutableString alloc] init];
- [array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOLBOOL * _Nonnull stop) {
- CIQRCodeFeature *temp = (CIQRCodeFeature *)obj;
- [str appendFormat:@"地址:%@",temp.messageString];
- }];
- self.msglabel.text = str;
- }
posted @
2016-07-20 09:05
阳光普照大地
阅读(
233)
评论()
收藏
举报