iOS开发 二维码扫描和生成

一.二维码扫描

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值