二维码 iOS
一:生成二维码
1.根据一个字符串生成一个二维码 根据
#import <CoreImage/CoreImage.h>这个框架写的
在按钮的点击事件写
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imv; @end
// 1. 实例化二维码滤镜
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; // 2. 恢复滤镜的默认属性
[filter setDefaults]; // 3. 将字符串转换成NSData
NSData *data = [@"http://www.baidu.com" dataUsingEncoding:NSUTF8StringEncoding]; // 4. 通过KVO设置滤镜inputMessage数据
[filter setValue:data forKey:@"inputMessage"];
// 5. 获得滤镜输出的图像
CIImage *outputImage = [filter outputImage];
UIImage *i = [UIImage imageWithCIImage:outputImage]; // 6. 将CIImage转换成UIImage,并放大显示
self.imv.image = i;
2.此时 就根据你写的字符串 会 生成一个对应的二维码了 但是有点模糊有没有 ??
解决的方法来啦
//7.把图片变的更清晰
CGRect extent = CGRectIntegral(outputImage.extent);
CGFloat size = 100;
CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent)); // 创建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:outputImage fromRect:extent];
CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, extent, bitmapImage); // 保存bitmap到图片
CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
UIImage *i = [UIImage imageWithCGImage:scaledImage];
清晰的有没有,^O^
3.微信的二维码名片是不是有自己的logo哇,怎么弄捏
UIImage *logoImage = [UIImage imageNamed:@"1111.png"];
UIView *QRCodeView = [[UIView alloc] init];
QRCodeView.frame = CGRectMake(0, 0, 100 , 100);
if (logoImage != nil) {
// 增加logo
i = [self addImageToSuperImage:i withSubImage:logoImage andSubImagePosition:CGRectMake(20, 20, 20, 20)];
}
QRCodeView.layer.contents = (__bridge id)i.CGImage;
这样就可以加上logo了
二:扫描二维码
用
#import <AVFoundation/AVFoundation.h>这个框架写
@interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>
@property(nonatomic,strong)AVCaptureSession *session;
@property(nonatomic,strong)AVCaptureVideoPreviewLayer *previewLayer;
@end
- (void)viewDidLoad {
[super viewDidLoad];
// 1. 实例化拍摄设备
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
// 2. 设置输入设备
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
// 3. 设置元数据输出
// 3.1 实例化拍摄元数据输出
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
// 3.3 设置输出数据代理
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
// 4. 添加拍摄会话
// 4.1 实例化拍摄会话
AVCaptureSession *session = [[AVCaptureSession alloc] init];
// 4.2 添加会话输入
[session addInput:input];
// 4.3 添加会话输出
[session addOutput:output];
// 4.3 设置输出数据类型,需要将元数据输出添加到会话后,才能指定元数据类型,否则会报错
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
self.session = session;
// 5. 视频预览图层
// 5.1 实例化预览图层, 传递_session是为了告诉图层将来显示什么内容
AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:_session];
preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
preview.frame = self.view.bounds;
// 5.2 将图层插入当前视图
[self.view.layer insertSublayer:preview atIndex:100];
self.previewLayer = preview;
// 6. 启动会话
[_session startRunning];
}
代理方法
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
// 会频繁的扫描,调用代理方法
// 1. 如果扫描完成,停止会话
[self.session stopRunning];
// 2. 删除预览图层
[self.previewLayer removeFromSuperlayer]; NSLog(@"%@", metadataObjects);
// 3. 设置界面显示扫描结果 if (metadataObjects.count > 0) {
AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];
// 提示:如果需要对url或者名片等信息进行扫描,可以在此进行扩展!
// _label.text = obj.stringValue;
NSLog(@"%@", obj.stringValue);
} }
三:最后封装了一下生成二维码的代码 代价可以直接用
-(UIImage *)superCIImageWith:(NSString*)urlString andSuperSize:(CGFloat)puserSize andlogoImage:(UIImage *)logoImage andLogoImageLocation:(CGRect)rect
{
// 1. 实例化二维码滤镜
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
// 2. 恢复滤镜的默认属性
[filter setDefaults]; // 3. 将字符串转换成NSData
NSData *data = [urlString dataUsingEncoding:NSUTF8StringEncoding]; // 4. 通过KVO设置滤镜inputMessage数据
[filter setValue:data forKey:@"inputMessage"]; // 5. 获得滤镜输出的图像
CIImage *outputImage = [filter outputImage]; // UIImage *i = [UIImage imageWithCIImage:outputImage];
// 6. 将CIImage转换成UIImage,并放大显示 //7.把图片变的更清晰
CGRect extent = CGRectIntegral(outputImage.extent);
CGFloat scale = MIN(puserSize/CGRectGetWidth(extent), puserSize/CGRectGetHeight(extent)); // 创建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:outputImage fromRect:extent];
CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, extent, bitmapImage); // 保存bitmap到图片
CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
UIImage *i = [UIImage imageWithCGImage:scaledImage]; UIView *QRCodeView = [[UIView alloc] init];
QRCodeView.frame = CGRectMake(0, 0, 400 , 400); if (logoImage != nil) {
// 增加logo
i = [self addImageToSuperImage:i withSubImage:logoImage andSubImagePosition:rect];
} QRCodeView.layer.contents = (__bridge id)i.CGImage;
return i; }
二维码 iOS的更多相关文章
- 页面中嵌套iframe,微信浏览器长按二维码识别不了
问题:在微信浏览器内,页面中嵌套iframe,iframe中用户触发事件后有个弹框会显示二维码,用户长按二维码可以识别并跳转.尝试了一下,安卓是正常的,但是ios是识别不了的. 解决过程: 1.这里客 ...
- 二维码合成,将苹果和安卓(ios和android)合成一个二维码,让用户扫描一个二维码就可以分别下载苹果和安卓的应用
因为公司推广的原因,没有合适的将苹果和安卓(ios和android)合成一个二维码的工具. 因为这个不难,主要是根据浏览器的UA进行判断,所以就自己开发了一个网站 网站名称叫:好推二维码 https ...
- 有关iOS系统中调用相机设备实现二维码扫描功能的注意点(3/3)
今天我们接着聊聊iOS系统实现二维码扫描的其他注意点. 大家还记得前面我们用到的输出数据的类对象吗?AVCaptureMetadataOutput,就是它!如果我们需要实现目前主流APP扫描二维码的功 ...
- iOS使用Zbar扫描二维码
iOS使用Zbar扫描二维码 标签(空格分隔):二维码扫描 iOS Zbar64位 正文: 首先下载一个支持64位系统的ZbarSDK的包,保存在了我的云盘里,地址:ZbarSDK 把文件拖到工程里面 ...
- 制作IOS企业版App网页扫描二维码下载安装
有时候我们需要在XX网站的主页上去扫描二维码下载,那么ios开发中如何做到这一点呢. 我给大家解答一下,这也是在最近工作中用到的部分,在网上了解了一些. 下面给大家分解一下步骤: 1.Plist 和 ...
- Ios二维码扫描(系统自带的二维码扫描)
Ios二维码扫描 这里给大家介绍的时如何使用系统自带的二维码扫描方法和一些简单的动画! 操作步骤: 1).首先你需要搭建UI界面如图:下图我用了俩个imageview和一个label 2).你需要在你 ...
- iOS - QRCode 二维码
1.QRCode 在 iOS7 以前,在 iOS 中实现二维码和条形码扫描,我们所知的有,两大开源组件 ZBar 与 ZXing. 这两大组件我们都有用过,这里总结下各自的缺点: 1.ZBar 在扫描 ...
- IOS开发技巧快速生成二维码
随着移动互联网的发展,二维码应用非常普遍,各大商场,饭店,水果店 基本都有二维码的身影,那么ios中怎么生成二维码呢? 下面的的程序演示了快速生成二维码的方法: 在ios里面要生成二维码,需要借助一个 ...
- iOS 读取相册二维码,兼容ios7(使用CIDetector 和 ZXingObjC)
ios从相册读取二维码,在ios8以上,苹果提供了自带的识别图片二维码的功能,这种方式效率最好,也是最推荐的,但是如果你的系统需要向下兼容ios7,就必须用其他方式. 这里我选择的是 ZXingObj ...
随机推荐
- set multiset 集合实现众数的统计
众数问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 所谓众数,就是对于给定的含有N个元素的多重集合,每个元素在S中出现次数最多的成为该元素的重数, 多重集合S重 ...
- mysql root密码
方法1: 用SET PASSWORD命令 首先登录MySQL. 格式:mysql> set password for 用户名@localhost = password('新密码'); 例子:my ...
- 以太网数据包、IP包、TCP/UDP 包的结构(转)
源:以太网数据包.IP包.TCP/UDP 包的结构 版本号(Version):长度4比特.标识目前采用的IP协议的版本号.一般的值为0100(IPv4),0110(IPv6). IP包头长度(Head ...
- leetcode--009 Linked List Cycle I
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZgAAACACAIAAAC5q+hAAAAJ+UlEQVR4nO2dwbXrKBJAOyelRShEQw
- 步进控件——UIStepper
步进控件,可用于替换传统用于输入值的文本框.步进控件提供了“+”和“-”两个按钮,用来改变stepper内部value的增加或减少,调用的事件是UIControlEventValueChanged.由 ...
- js实现的文章输入检查与测速。
在群里聊天,一个群友求助.说要实现 文章对比输入,出错了标红,正确的标绿. 同时还需要统计正确率. 我一开始以为很容易,结果搞了半天.最后折腾出来了. 这里的思路如下:利用js的数组.将文章和输入的内 ...
- 【转】Linux目录下/dev/shm的理解和使用
一般来说,现场部署 都要根据内存的大小来设定/dev/shm的大小,大部分使用的是默认的值! Linux目录下/dev/shm的理解和使用 [日期:2014-05-16] 来源:Linux社区 作 ...
- sql2000/sql2005/sql2008数据库变为0字节修复/MDF文件0字节恢复
[数据恢复故障描述] 这个客户是生产型数据库,数据比较重要,产生量也比较大,客户要求必须尽快修复,保证生产尽快恢复运行.sql数据库文件,由于碎片链接过长,mdf文件突然变为0字节,开始客户尝试自行 ...
- UVa 10074 - Take the Land
题目大意:和UVa 836 - Largest Submatrix差不多,只需要修改一下数据就可以了. #include <cstdio> #include <cstring> ...
- Memcached操作以及用法
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...