1. import Foundation
  2. import CoreImage
  3. import UIKit
  4. extension UIColor {
  5. var coreImageColor: CIColor {
  6. return CIColor(color: self)
  7. }
  8. var components: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
  9. let coreImageColor = self.coreImageColor
  10. return (coreImageColor.red, coreImageColor.green, coreImageColor.blue, coreImageColor.alpha)
  11. }
  12. }
  13. class QRCreateModel {
  14. /// 文本
  15. var text: String!
  16. /// 二维码中间的logo
  17. var logo: String?
  18. /// 二维码缩放倍数{27*scale,27*scale}
  19. var scale: Float = 10
  20. /// 二维码背景颜色
  21. var backgroundColor: UIColor = UIColor.white
  22. /// 二维码颜色
  23. var contentColor: UIColor = UIColor.black
  24. }
  25. class QRCreator {
  26. static let shared = QRCreator()
  27. private let qrFilter: CIFilter
  28. private let colorFilter: CIFilter
  29. private init() {
  30. /// 创建二维码滤镜
  31. qrFilter = CIFilter(name: "CIQRCodeGenerator")!
  32. /// 创建颜色滤镜
  33. colorFilter = CIFilter(name: "CIFalseColor")!
  34. }
  35. private func createBase(text: String, scale: Float) -> CIImage? {
  36. qrFilter.setDefaults()
  37. guard let data = text.data(using: String.Encoding.utf8) else {
  38. return nil
  39. }
  40. /// 给二维码滤镜设置inputMessage
  41. qrFilter.setValue(data, forKey: "inputMessage")
  42. guard var outputImage = qrFilter.outputImage else {
  43. return nil
  44. }
  45. outputImage = outputImage.transformed(by: CGAffineTransform(scaleX: CGFloat(scale), y: CGFloat(scale)))
  46. return outputImage
  47. }
  48. private func colourFilter(ciImage: CIImage, model: QRCreateModel) -> CIImage? {
  49. /// 颜色滤镜恢复默认值
  50. colorFilter.setDefaults()
  51. /// 设置颜色滤镜的inputImage
  52. colorFilter.setValue(ciImage, forKey: "inputImage")
  53. /// 设置inputImage的backgroundColor(key: inputColor1)
  54. colorFilter.setValue(model.backgroundColor.coreImageColor, forKey: "inputColor1")
  55. /// 设置inputImage的contentColor(key: inputColor0)
  56. colorFilter.setValue(model.contentColor.coreImageColor, forKey: "inputColor0")
  57. return colorFilter.outputImage
  58. }
  59. private func addLogo(ciImage: CIImage, model: QRCreateModel) -> UIImage? {
  60. guard let _ = model.logo,
  61. let logoImage = UIImage(named: model.logo!) else {
  62. return nil
  63. }
  64. let image = UIImage(ciImage: ciImage)
  65. let originX = (image.size.width - logoImage.size.width)/2.0
  66. let originY = (image.size.height - logoImage.size.height)/2.0
  67. UIGraphicsBeginImageContext(image.size)
  68. image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))
  69. logoImage.draw(in: CGRect(x: originX, y: originY, width: logoImage.size.width, height: logoImage.size.height))
  70. let outPutImage = UIGraphicsGetImageFromCurrentImageContext()
  71. UIGraphicsEndImageContext()
  72. return outPutImage
  73. }
  74. func create(_ model: QRCreateModel) -> UIImage? {
  75. guard var outputImage = createBase(text: model.text, scale: model.scale) else {
  76. return nil
  77. }
  78. if let colorOutputImage = colourFilter(ciImage: outputImage, model: model) {
  79. outputImage = colorOutputImage
  80. }
  81. guard let qrImageWithLogo = addLogo(ciImage: outputImage, model: model) else {
  82. return UIImage(ciImage: outputImage)
  83. }
  84. return qrImageWithLogo
  85. }
  86. }

完整使用示例

  1. let qrModel = QRCreateModel()
  2. qrModel.text = "https://www.yaozuopan.top"
  3. qrModel.contentColor = UIColor.yellow
  4. qrModel.backgroundColor = UIColor.gray
  5. /// 二维码的容错率最大为30%(即二维码被遮挡的部分不能大于30%,否则二维码无法被识别)
  6. /// e.g.
  7. /// 假设二维码大小为{100,100}, logo的大小最大为{30,30}
  8. /// 在设置loog请注意
  9. // qrModel.logo = "mylogo"
  10. if let qrImage = QRCreator.shared.create(qrModel) {
  11. print(qrImage.size.width)
  12. print(qrImage.size.height)
  13. // imageView.image = qrImage
  14. }

简洁使用

  1. let qrModel = QRCreateModel()
  2. qrModel.text = "https://www.yaozuopan.top"
  3. if let qrImage = QRCreator.shared.create(qrModel) {
  4. // imageView.image = qrImage
  5. }

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

前往

iOS 原生实现生成二维码(CoreImage)工具类,不依赖第三方库,可自定义背景颜色,添加logo(Swift 4.0)的更多相关文章

  1. iOS原生CIFilter创建二维码

    iOS原生CIFilter创建二维码 2016-05-31 未来C iOS原生CIFilter创建二维码 关于二维码生成,网上也是有很多,很早以前的第三方库大多数都是通过C++写,也是有的如zxing ...

  2. IOS原生方法实现二维码生成与扫描

    转自:http://www.jianshu.com/p/d6663245d3fa 二维码的生成有好多第三方库,如Z-Xing.但是为了控制安装包的大小,或者并不需要其他的一些额外的功能,用系统的方法即 ...

  3. iOS开发之生成二维码

    一.二维码的生成 从iOS7开始集成了二维码的生成和读取功能 此前被广泛使用的zbarsdk目前不支持64位处理器   1.二维码的内容(传统的条形码只能放数字) 纯文本 名片 URL   2.生成二 ...

  4. iOS 根据url生成二维码贴到底图上

    根据url 生成指定尺寸的二维码图片 UIImage * createBinaryCodeImg(const char * url ,CGFloat size) { //create binary c ...

  5. iOS 原生库(AVFoundation)实现二维码扫描,封装的工具类,不依赖第三方库,可高度自定义扫描动画及界面(Swift 4.0)

    Create QRScanner.swift file // // QRScanner.swift // NativeQR // // Created by Harvey on 2017/10/24. ...

  6. 生成二维码 加密解密类 TABLE转换成实体、TABLE转换成实体集合(可转换成对象和值类型) COOKIE帮助类 数据类型转换 截取字符串 根据IP获取地点 生成随机字符 UNIX时间转换为DATETIME\DATETIME转换为UNIXTIME 是否包含中文 生成秘钥方式之一 计算某一年 某一周 的起始时间和结束时间

    生成二维码 /// <summary>/// 生成二维码/// </summary>public static class QRcodeUtils{private static ...

  7. firefox 最新版地址栏后没有生成二维码的工具

    下载火狐离线安装包50.0.2版本,安装后找不到这个图标了,搜索下载附加组件管理器cpmanager-1.2.13.xpi,提示没有签名无法安装,最后下载了一个较高版本的cpmanager-1.5.5 ...

  8. 把url链接转换成二维码的工具类

    import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io ...

  9. iOS开发——生成二维码——工具类

    啥也不说,直接上源码,拷过去就能用.生成二维码的工具类使用方法在ProduceQRCode.h里有示例说明 分别将下面的ProduceQRCode.h和ProduceQRCode.m对应的代码考到自己 ...

随机推荐

  1. 网站log记录

    记录网站日志可以清晰的把控网站运行状态. 程序中对外部系统和模块的调用前后都需要记日志,方便接口调试. 数据库操作处需要记日志.

  2. Substring(Codeforces-D-拓扑排序)

    D. Substring time limit per test 3 seconds memory limit per test 256 megabytes You are given a graph ...

  3. 中国的规模优势,有望帮助AI芯片后来者居上?

    ​芯片一直是个神奇的东西,表面上看是电脑.笔记本.智能手机改变了世界,其实,真正改变世界的硬件内核是芯片,芯片相关的技术才是科技界最实用.最浪漫的基础技术,也正因如此,谁掌握了芯片基础技术,谁就能立于 ...

  4. canvas基本

    基本 支持ie 9+,firefox,opera,chrome,safari html: <canvas id="fir_canvas" width="400&qu ...

  5. springboot+jwt实现token登陆权限认证

    一 前言 此篇文章的内容也是学习不久,终于到周末有时间码一篇文章分享知识追寻者的粉丝们,学完本篇文章,读者将对token类的登陆认证流程有个全面的了解,可以动态搭建自己的登陆认证过程:对小项目而已是个 ...

  6. Ajax&Json案例

    案例: * 校验用户名是否存在 1. 服务器响应的数据,在客户端使用时,要想当做json数据格式使用.有两种解决方案: 1. $.get(type):将最后一个参数type指定为"json& ...

  7. Manjaro 19.01 kde下Tim sogou软件安装问题及解决

    我的系统配置 首先第一个问题是,在manjaro下Tim Thunderspeed这种deepin-wine的软件.今天我在装这些软件的时候,安装之后不能打开,闪退.苦恼了我好一会儿.终于找到了解决的 ...

  8. 从头认识js-基本概念(关键字,保留字,数据类型)

    语法 ECMAScript的语法大量借鉴了C及其他类C语言(如Java和Perl)的语法.因此,熟悉这些语言的开发人员在接受ECMSAScript更加宽松的语法时,一定会有一种轻松自在的感觉. 区分大 ...

  9. C# 关于位运算的学习笔记

    一.理解什么是位运算 程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),简单来说位运算就是直接对在内存中的二进制数的每位进行运算操作. 二.学习前先了解一下有哪些运算,运算符都怎么 ...

  10. 端口占用的一种形式 Failed to initialize end point associated with ProtocolHandler ["ajp-bio-8090"] java.net.BindException: Address already in use: JVM_Bind <null>:8090

    严重: Failed to initialize end point associated with ProtocolHandler ["ajp-bio-8090"]java.ne ...