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? /// 二维码缩放倍数{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() { /// 创建二维码滤镜
qrFilter = CIFilter(name: "CIQRCodeGenerator")! /// 创建颜色滤镜
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
} /// 给二维码滤镜设置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? { /// 颜色滤镜恢复默认值
colorFilter.setDefaults() /// 设置颜色滤镜的inputImage
colorFilter.setValue(ciImage, forKey: "inputImage") /// 设置inputImage的backgroundColor(key: inputColor1)
colorFilter.setValue(model.backgroundColor.coreImageColor, forKey: "inputColor1") /// 设置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.
/// 假设二维码大小为{100,100}, logo的大小最大为{30,30}
/// 在设置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
}

代码及示例下载(有实现二维码扫描)

前往

最新文章

  1. tp框架之自动验证表单
  2. MYSQL 解锁与锁表
  3. PHP----Ajax异步请求
  4. 使用Python的yield实现流计算模式
  5. TreeSet和TreeMap的输出
  6. I/O复用:异步聊天
  7. log4j打印日志配置
  8. 前端H5开发工具 Adobe Edge
  9. Storm因机器断电等,启动supervisor异常
  10. 【翻译】Organizing ASP.NET MVC solutions 如何组织你的ASP.NET MVC解决方案
  11. Oracle 常见函数使用汇总
  12. python带cookie提交表单自动登录(转)
  13. 配置 Ionic环境
  14. 关于github 0.6.2版本的使用方法
  15. Python基础知识总结
  16. Plickers——教师拿手机、学生拿卡片,就可以完成即时全员互动!
  17. python------面向对象进阶 Socket网络编程
  18. L1-033 出生年
  19. Centos7下python3安装ipython
  20. Java参数传值?or传引用?

热门文章

  1. Java中的字符串比较
  2. Python实现线程交替打印字符串
  3. 通过ELK快速搭建集中化日志平台
  4. 华为Mate 10牵手Microsoft Translator,让离线翻译可媲美在线神经网
  5. 内核融合:GPU深度学习的“加速神器”
  6. Shopee招聘-测试开发leader(30k-60k/月)
  7. mongodb游标快照
  8. Activity源码解析 - 读书笔记
  9. Android系统使用Shell脚本预装apk
  10. 3——PHP 简单运算符的使用