iOS开发 二维码扫描和生成
来源:互联网 发布:程序设计导论 python 编辑:程序博客网 时间:2024/06/06 00:03
一.二维码扫描
1.第一种方法:需要引入ZXingObjC(系统版本是iOS 8以下的)
/** * 从图片中读取二维码 这是iOS7以后的方法 * * @param qrImage 一张二维码图片 * * @return 二维码信息 */+ (NSString *)scQRReaderForImage:(UIImage *)qrImage{ if (qrImage == nil) { return nil; } ZXLuminanceSource *source = [[ZXCGImageLuminanceSource alloc] initWithCGImage:qrImage.CGImage]; ZXBinaryBitmap *bitmap = [ZXBinaryBitmap binaryBitmapWithBinarizer:[ZXHybridBinarizer binarizerWithSource:source]]; NSError *error = nil; ZXDecodeHints *hints = [ZXDecodeHints hints]; ZXMultiFormatReader *reader = [ZXMultiFormatReader reader]; ZXResult *result = [reader decode:bitmap hints:hints error:&error]; // The coded result as a string. The raw data can be accessed with // result.rawBytes and result.length. return result.text;}
2.第二种方法:(系统版本是iOS8以上的)
/** * 从图片中读取二维码 这是iOS8以后的方法 * * @param qrImage 一张二维码图片 * * @return 二维码信息 */+ (NSString *)scQRReaderiOS8ForImage:(UIImage *)qrImage NS_AVAILABLE_IOS(8_0){ if (qrImage == nil) { return nil; } UIImage *srcImage = qrImage; CIContext *context = [CIContext contextWithOptions:nil]; CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:context options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}]; CIImage *image = [CIImage imageWithCGImage:srcImage.CGImage]; NSArray *features = [detector featuresInImage:image]; CIQRCodeFeature *feature = [features firstObject]; NSString *result = feature.messageString; return result;}
二.二维码生成
1.第一种方法:需要引入ZXingObjC
/** * 根据给定的字符串生成一个给定尺寸的二维码image * * @param qrString 二维码的内容 * @param imageSize 二维码生成后的尺寸大小 * * @return 二维码 */+ (UIImage *)zxQRCodeForString:(NSString *)qrString size:(CGFloat)imageSize{ if (qrString.length == 0) { return nil; } if (imageSize < 10.0) { return nil; } NSError *error = nil; ZXMultiFormatWriter *writer = [ZXMultiFormatWriter writer]; ZXBitMatrix *result = [writer encode:qrString format:kBarcodeFormatQRCode width:imageSize height:imageSize error:&error]; if (result) { CGImageRef image = [[ZXImage imageWithMatrix:result] cgimage]; UIImage *qrImage = [UIImage imageWithCGImage:image]; return qrImage; } return nil;}
2.第二种方法:需要调第五种方法
/** * 根据给定的字符串生成一个给定尺寸的二维码image * * @param qrString 二维码的内容 * @param imageSize 二维码生成后的尺寸大小 * * @return 二维码 */+ (UIImage *)scQRCodeForString:(NSString *)qrString size:(CGFloat)imageSize{ return [self scQRCodeForString:qrString size:imageSize fillColor:[UIColor blackColor] backColor:[UIColor whiteColor]];}
3.第三种方法:需要调第五种方法
/** * 根据给定的字符串生成一个给定尺寸和填充颜色的二维码image * * @param qrString 二维码的内容 * @param imageSize 二维码生成后的尺寸大小 * @param fillColor 二维码填充颜色 * * @return 二维码 */+ (UIImage *)scQRCodeForString:(NSString *)qrString size:(CGFloat)imageSize fillColor:(UIColor *)fillColor{ return [self scQRCodeForString:qrString size:imageSize fillColor:fillColor backColor:[UIColor whiteColor]];}
4.第四种方法:需要调第五种方法
/** * 根据给定的字符串生成一个给定尺寸和背景颜色的二维码image * * @param qrString 二维码的内容 * @param imageSize 二维码生成后的尺寸大小 * @param fillColor 二维码背景颜色 * * @return 二维码 */+ (UIImage *)scQRCodeForString:(NSString *)qrString size:(CGFloat)imageSize backColor:(UIColor *)backColor{ return [self scQRCodeForString:qrString size:imageSize fillColor:[UIColor blackColor] backColor:backColor];}
5.第五种方法:
/** * 根据给定的字符串生成一个给定尺寸和给定颜色的二维码image * * @param qrString 二维码的内容 * @param imageSize 二维码生成后的尺寸大小 * @param fillColor 二维码填充颜色 * @param backColor 二维码背景颜色 * * @return 二维码 */+ (UIImage *)scQRCodeForString:(NSString *)qrString size:(CGFloat)imageSize fillColor:(UIColor *)fillColor backColor:(UIColor *)backColor{ if (qrString.length == 0) { return nil; } if (imageSize < 10.0) { return nil; } if (!fillColor) { fillColor = [UIColor blackColor]; } if (!backColor) { backColor = [UIColor whiteColor]; } NSData *stringData = [qrString dataUsingEncoding:NSUTF8StringEncoding]; //生成 CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; [qrFilter setValue:stringData forKey:@"inputMessage"]; [qrFilter setValue:@"M" forKey:@"inputCorrectionLevel"]; //上色 CIFilter *colorFilter = [CIFilter filterWithName:@"CIFalseColor" keysAndValues: @"inputImage",qrFilter.outputImage, @"inputColor0",[CIColor colorWithCGColor:fillColor.CGColor], @"inputColor1",[CIColor colorWithCGColor:backColor.CGColor], nil]; CIImage *qrImage = colorFilter.outputImage; //绘制 CGSize imgSize = CGSizeMake(imageSize, imageSize); CGImageRef cgImage = [[CIContext contextWithOptions:nil] createCGImage:qrImage fromRect:qrImage.extent]; UIGraphicsBeginImageContext(imgSize); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetInterpolationQuality(context, kCGInterpolationNone); CGContextScaleCTM(context, 1.0, -1.0); CGContextDrawImage(context, CGContextGetClipBoundingBox(context), cgImage); UIImage *codeImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); CGImageRelease(cgImage); return codeImage;}
6.第六种方法:生成中间有logo的二维码
/** * 生成中间有logo的二维码 * * @param qrString 二维码的内容 * @param imageSize 二维码生成后的尺寸大小 * @param fillColor 二维码填充颜色 * @param backColor 二维码背景颜色 * @param subImage 二维码的子图 * * @return 带有子图的二维码 */+ (UIImage *)scQRCodeForString:(NSString *)qrString size:(CGFloat)imageSize fillColor:(UIColor *)fillColor backColor:(UIColor *)backColor subImage:(UIImage *)subImage{ UIImage *qrImage = [QRUtil scQRCodeForString:qrString size:imageSize fillColor:fillColor backColor:backColor]; if (subImage) { return [self addSubImage:qrImage sub:subImage]; } return qrImage;}
#pragma mark - private+ (UIImage *)addSubImage:(UIImage *)img sub:(UIImage *)subImage{ //get image width and height NSInteger w = img.size.width; NSInteger h = img.size.height; NSInteger subWidth = subImage.size.width; NSInteger subHeight = subImage.size.height; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); //create a graphic context with CGBitmapContextCreate CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst); CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage); CGContextDrawImage(context, CGRectMake( (w-subWidth)/2, (h - subHeight)/2, subWidth, subHeight), [subImage CGImage]); CGImageRef imageMasked = CGBitmapContextCreateImage(context); CGContextRelease(context); CGColorSpaceRelease(colorSpace); return [UIImage imageWithCGImage:imageMasked];}
阅读全文
0 0
- iOS开发二维码生成和扫描
- iOS开发 二维码扫描和生成
- ios 开发之 扫描二维码和生成二维码
- iOS开发之 二维码生成/二维码扫描
- ios二维码生成和扫描
- iOS 二维码生成和扫描
- ios 二维码扫描和生成
- IOS 开发笔记——二维码的生成和扫描
- iOS开发-原生二维码的扫描和生成
- iOS开发-原生二维码的扫描和生成
- iOS开发--二维码/条形码(扫描(可区域)和生成)
- iOS开发技术 - 二维码扫描、生成
- IOS开发二维码生成及扫描ZBarDemo
- iOS自带扫描 和 生成二维码
- iOS 二维码的生成和扫描
- iOS自带扫描 和 生成二维码
- iOS平台 二维码生成和扫描
- iOS--二维码生成和扫描
- Django 设置template的全局变量
- 程序员面试(1):利用位运算完成两个整数的加法运算
- 决策树(decision tree)的自我理解 (上)
- Swift3.0 直接插入排序
- 深入解析String#intern
- iOS开发 二维码扫描和生成
- LeetCode (Binary Tree Preorder Traversal)
- 【Algothrim】求从n个数中取r个数的组合
- [Java算法分析与设计]链式队列的实现
- windows 2008 server 安装VS2010 后无法无法访问数据库,提示“ORA-06413: 连接未打开”
- logback配置
- Android模拟按键
- 【Zookeeper 1】Zookeeper的功能以及工作原理
- JAVA面试 中级