1. 程式人生 > >IOS 二維碼生成

IOS 二維碼生成

alt width 指定 urn filter 網站 gre interface eas

這篇博客將會介紹二維碼的生成。

由於沒有什麽東西值得長篇大論的,所以這裏我就通過代碼的實現介紹二維碼。

第一部分

第一部分是二維碼的簡單生成沒有其他重點介紹。

效果圖

技術分享

代碼部分

技術分享
//
//  ViewController.m
//  CX 二維碼生成
//
//  Created by ma c on 16/4/12.
//  Copyright ? 2016年 bjsxt. All rights reserved.
//

#import "ViewController.h"
#import <CoreImage/CoreImage.h>
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    //創建過濾器
    CIFilter * filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    //恢復默認設置
    [filter setDefaults];
    //給過濾器添加數據
    NSString * str = @"旭寶愛吃魚";//這裏的文本可以是URL
    NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
    [filter setValue:data forKey:@"inputMessage"];
    //輸出獲取的二維碼
     CIImage * image = [filter outputImage];
    //顯示二維碼
    UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(20, 20, 100, 100)];
    imageView.image = [UIImage imageWithCIImage:image];
    [self.view addSubview:imageView];
    
}

@end
技術分享

雖然說很簡單,但是值得註意的是原生框架中的方法生成的二維碼是CI的因此我們在顯示之前要處理一下。

掃描第一部分出來的是一段文字,當然按照註釋如果你加入url也可以彈出網站。

如果仔細觀察不難發現,二位碼的清晰度並不高。我在下面介紹一下使其清晰度變高的方法。

第二部分

第二部分介紹的是使二維碼的清晰度變高的方法。

效果圖

技術分享
代碼部分

技術分享
//
//  ViewController.m
//  CX 二維碼生成
//
//  Created by ma c on 16/4/12.
//  Copyright ? 2016年 bjsxt. All rights reserved.
//

#import "ViewController.h"
#import <CoreImage/CoreImage.h>
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    //創建過濾器
    CIFilter * filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    //恢復默認設置
    [filter setDefaults];
    //給過濾器添加數據
    NSString * str = @"旭寶愛吃魚";//這裏的文本可以是URL
    NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
    [filter setValue:data forKey:@"inputMessage"];
    //輸出獲取的二維碼
     CIImage * image = [filter outputImage];
    //顯示二維碼
    UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(20, 20, 100, 100)];
    imageView.image = [self createNonInterpolatedUIImageFormCIImage:image withSize:200];
    [self.view addSubview:imageView];

}

/**
 *  根據CIImage生成指定大小的UIImage
 *
 *  @param image CIImage
 *  @param size  圖片寬度
 */
- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size
{
    
    CGRect extent = CGRectIntegral(image.extent);
    CGFloat scale = MIN(size/CGRectGetWidth(extent), size/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];
}
@end
技術分享

值得註意的是這個方法可以變為類別。

這些弄好之後我們要想一想很多時候二維碼中間是有圖片的該怎麽做呢???

很簡單只要自己弄張圖片覆蓋在二維碼中間即可(註意圖片尺寸掌握好)

IOS 二維碼生成