Ceate QRCreator.swift
file
//
// QRCreator.swift
// NativeQR
//
// Created by Harvey on 2017/10/24.
// Copyright ? 2017年 Harvey. All rights reserved.
//
import Foundation
import CoreImage
import UIKit
extension UIColor {
var coreImageColor: CIColor {
return CIColor(color: self)
}
var components: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
let coreImageColor = self.coreImageColor
return (coreImageColor.red, coreImageColor.green, coreImageColor.blue, coreImageColor.alpha)
}
}
class QRCreateModel {
/// 文本
var text: String!
/// 二維碼中間的logo
var logo: String?
/// 二維碼縮放倍數(shù){27*scale,27*scale}
var scale: Float = 10
/// 二維碼背景顏色
var backgroundColor: UIColor = UIColor.white
/// 二維碼顏色
var contentColor: UIColor = UIColor.black
}
class QRCreator {
static let shared = QRCreator()
private let qrFilter: CIFilter
private let colorFilter: CIFilter
private init() {
/// 創(chuàng)建二維碼濾鏡
qrFilter = CIFilter(name: "CIQRCodeGenerator")!
/// 創(chuàng)建顏色濾鏡
colorFilter = CIFilter(name: "CIFalseColor")!
}
private func createBase(text: String, scale: Float) -> CIImage? {
qrFilter.setDefaults()
guard let data = text.data(using: String.Encoding.utf8) else {
return nil
}
/// 給二維碼濾鏡設(shè)置inputMessage
qrFilter.setValue(data, forKey: "inputMessage")
guard var outputImage = qrFilter.outputImage else {
return nil
}
outputImage = outputImage.transformed(by: CGAffineTransform(scaleX: CGFloat(scale), y: CGFloat(scale)))
return outputImage
}
private func colourFilter(ciImage: CIImage, model: QRCreateModel) -> CIImage? {
/// 顏色濾鏡恢復(fù)默認(rèn)值
colorFilter.setDefaults()
/// 設(shè)置顏色濾鏡的inputImage
colorFilter.setValue(ciImage, forKey: "inputImage")
/// 設(shè)置inputImage的backgroundColor(key: inputColor1)
colorFilter.setValue(model.backgroundColor.coreImageColor, forKey: "inputColor1")
/// 設(shè)置inputImage的contentColor(key: inputColor0)
colorFilter.setValue(model.contentColor.coreImageColor, forKey: "inputColor0")
return colorFilter.outputImage
}
private func addLogo(ciImage: CIImage, model: QRCreateModel) -> UIImage? {
guard let _ = model.logo,
let logoImage = UIImage(named: model.logo!) else {
return nil
}
let image = UIImage(ciImage: ciImage)
let originX = (image.size.width - logoImage.size.width)/2.0
let originY = (image.size.height - logoImage.size.height)/2.0
UIGraphicsBeginImageContext(image.size)
image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))
logoImage.draw(in: CGRect(x: originX, y: originY, width: logoImage.size.width, height: logoImage.size.height))
let outPutImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return outPutImage
}
func create(_ model: QRCreateModel) -> UIImage? {
guard var outputImage = createBase(text: model.text, scale: model.scale) else {
return nil
}
if let colorOutputImage = colourFilter(ciImage: outputImage, model: model) {
outputImage = colorOutputImage
}
guard let qrImageWithLogo = addLogo(ciImage: outputImage, model: model) else {
return UIImage(ciImage: outputImage)
}
return qrImageWithLogo
}
}
完整使用示例
let qrModel = QRCreateModel()
qrModel.text = "https://www.yaozuopan.top"
qrModel.contentColor = UIColor.yellow
qrModel.backgroundColor = UIColor.gray
/// 二維碼的容錯率最大為30%(即二維碼被遮擋的部分不能大于30%,否則二維碼無法被識別)
/// e.g.
/// 假設(shè)二維碼大小為{100,100}, logo的大小最大為{30,30}
/// 在設(shè)置loog請注意
// qrModel.logo = "mylogo"
if let qrImage = QRCreator.shared.create(qrModel) {
print(qrImage.size.width)
print(qrImage.size.height)
// imageView.image = qrImage
}
簡潔使用
let qrModel = QRCreateModel()
qrModel.text = "https://www.yaozuopan.top"
if let qrImage = QRCreator.shared.create(qrModel) {
// imageView.image = qrImage
}
代碼及示例下載(有實現(xiàn)二維碼掃描)
NativeQR