生活中我们每天都会见到二维码,那么二维码是什么意思呢?简单来讲,二维码是将某个数据信息转化为了二进制,即0和1的组合,在一个完整的二维码图像中,黑色小方块就代表着1,白色小方块就代表着0,数据不相同,那么0和1的组合情况就会不一样,也就会生成不同的二维码图像。如果你仔细观察过二维码,你会发现二维码有三个角有大一点的方框区域,只有右下角没有,这三个角是为了让相机判断方向的,有了这个无论从哪个方向扫描二维码都会得到唯一的一个数据信息。接下来我们看一下如何用代码实现二维码图像的生成:
#pragma mark -- 使用给定的字符串获得CIImage类型的对象
- (CIImage *)getImageByString:(NSString *)dataString
{
//首先判断字符串是否合理!
if (!dataString || dataString == nil || [dataString isEqualToString:@""])
{
return nil;
}
//实例化一个滤镜对象
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
//1、设置filter的默认值,防止之前的设置对本次转化有影响
[filter setDefaults];
//2、将传入的字符串转换为NSData
NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
//3、将NSData传递给滤镜(通过KVC的方式,设置inputMessage)
[filter setValue:data forKey:@"inputMessage"];
//4、由filter对象输出图像
CIImage *outputImage = [filter outputImage];
//5、返回二维码图像
return outputImage;
}
#pragma mark -- 对图像进行清晰处理,很关键!
- (UIImage *)excludeFuzzyImageFromCIImage: (CIImage *)image size: (CGFloat)size
{
CGRect extent = CGRectIntegral(image.extent);
//通过比例计算,让最终的图像大小合理(正方形是我们想要的)
CGFloat scale = MIN(size / CGRectGetWidth(extent), size / CGRectGetHeight(extent));
size_t width = CGRectGetWidth(extent) * scale;
size_t height = CGRectGetHeight(extent) * scale;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, colorSpace, (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);
CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
//切记ARC模式下是不会对CoreFoundation框架的对象进行自动释放的,所以要我们手动释放
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
CGColorSpaceRelease(colorSpace);
return [UIImage imageWithCGImage: scaledImage];
}
具体使用如下:
- (void)viewDidLoad {
[super viewDidLoad];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
imageView.center = self.view.center;
[self.view addSubview:imageView];
CIImage *ciImage = [self getImageByString:@"http://www.jianshu.com/users/be2c0f5976c1/latest_articles"];
imageView.image = [self excludeFuzzyImageFromCIImage:ciImage size:200];
}
效果如下:
CoderDoctorLee 欢迎扫描
备注:后续会添加上对于二维码图像的一些修饰性操作,如添加个性小图片(参考微信),改变颜色等。
网友评论