您的位置:首页 > 移动开发 > Swift

Swift3.1二维码的生成与扫描

2017-07-17 17:38 190 查看
简介

应用市场上,80%甚至更多的APP都有生成或者扫描二维码的功能。如:扫码登录、加好友及扫码支付等。

二维码本质上是一串二进制数据,我们可以在二维码中放入任何信息。如:分享的WiFi密码、QQ(微信)号、设备码及网址(PS:支付宝扫描二维码的原理就是将订单信息编程一个网址链接放入到二维码中,这样做的好处:如果是支付宝客户端扫描则能够立即支付,如果是其他客户端扫描,则其他客户端要是扫描的时候,设备中没有安装支付宝客户端,则可以跳转到支付宝网页版进行支付)等。

可以这么说:二维码的生成与扫描已可以算得上是APP开发的必备技能之一。

二维码的类型

主要有三类

黑白二维码

彩色二维码

带图片的二维码

二维码四大元素

二维码的内容

前景色

背景色

中间的图片

其中二维码的内容、前景色及背景色都是通过KVC赋值的,而中间的图片是用绘图上下文绘制上去的

主要代码

/// 生成二维码
func createQRcodeImage (qrString: String?, imageName: String?, foreColor: CIColor?, backColor: CIColor?) -> UIImage{
if let qrString = qrString {
// 0、如果二维码内容为"",返回
if qrString.isEmpty {
return UIImage()
}
//1、创建二维码过滤器并设置默认值
let qrCodeFilter = CIFilter(name: "CIQRCodeGenerator")
qrCodeFilter?.setDefaults()

//2、设置二维码的内容
qrCodeFilter?.setValue("二维码的内容".data(using: String.Encoding.utf8), forKey: "inputMessage")

//3、从二维码过滤器中获取输出图片
let ciImage = qrCodeFilter?.outputImage

//4、创建颜色过滤器并设置默认值
let colorFilter = CIFilter(name: "CIFalseColor")
colorFilter?.setDefaults()

//5、设置二维码图片的前景色跟背景色(常规的黑白二维码就是前景色为黑色,背景色为白色)
colorFilter?.setValue(ciImage, forKey: "inputImage")
colorFilter?.setValue(foreColor, forKey: "inputColor0")
colorFilter?.setValue(backColor, forKey: "inputColor1")

//6、在不失真的情况下放大图片
let uiImage = UIImage.init(ciImage: (colorFilter?.outputImage?.applying(CGAffineTransform(scaleX: 6, y: 6)))!)

//7、输出图片
return self.drameImageWhitSourceImage(image: uiImage, centerImageName: imageName, centerImagewidth: 30, centerImageheight: 30)
}
return UIImage()
}

/// 二维码中心图片的绘制
func drameImageWhitSourceImage(image: UIImage?, centerImageName: String?, centerImagewidth: CGFloat? = 0, centerImageheight: CGFloat? = 0) -> UIImage {
if let image = image {

//1、开启绘图上下文(参数是绘制图片控件的大小)
UIGraphicsBeginImageContext(image.size)

//2、绘制大图
image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))

//3、小图的位置、大小信息并绘制小图
let centerImageX = image.size.width / 2 - centerImagewidth! / 2
let centerImageY = image.size.height / 2 - centerImageheight! / 2
let image = UIImage.init(named: centerImageName!)
image?.draw(in: CGRect(x: centerImageX, y: centerImageY, width: centerImagewidth!, height: centerImageheight!))

//4、从绘图上下文获取图片
let resultImage = UIGraphicsGetImageFromCurrentImageContext()

//5、关闭上下文
UIGraphicsEndImageContext()

//6、返回绘制好的图片
if let resultImage = resultImage {
return resultImage
}
}
return UIImage()
}


扫描待填坑
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息