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
}

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

前往

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. iOS开发之多线程(NSThread、NSOperation、GCD)

    整理一些多线程相关的知识. 并行 & 并发 1.并行:并行是相对于多核而言的,几个任务同时执行.2.并发:并发是相对于单核而言的,几个任务之间快速切换运行,看起来像是"同时" ...

  2. 递归加法(day1)

    题目:求1+2+-+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句(A?B:C). 使用函数指针 1 2 3 4 5 6 7 8 9 10 ...

  3. L2-013 红色警报(25 分)

    L2-013 红色警报(25 分)战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全连通,是 ...

  4. C++走向远洋——23(项目一,三角形,类)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:sanjiaoxing.cpp * 作者:常轩 * 微信公众号: ...

  5. Golang/Python/PHP带你彻底学会gRPC

    目录 一.gRPC是什么? 二.Protocol Buffers是什么? 三.需求:开发健身房服务 四.最佳实践 Golang 1. 安装protoc工具 2. 安装protoc-gen-go 3. ...

  6. python 字典元组集合字符串

    s1 = ''hello, world!'' s2 = '\n\hello, world!\\n' print(s1, s2, end='') s1 = '\141\142\143\x61\x62\x ...

  7. SpringBoot&Shiro实现用户认证

    SpringBoot&Shiro实现用户认证 实现思路 思路:实现认证功能主要可以归纳为3点 1.定义一个ShiroConfig配置类,配置 SecurityManager Bean , Se ...

  8. 压力测试(六)-阿里云Linux服务器压测接口实战

    1.SpringBoot 接口打包,并用jar包方式部署 简介:用jar包方式在控制台进行启动 打包 mvn package && java -jar target/gs-spring ...

  9. Day 3 DP

    1. P1015 精卫填海 01背包 + 判断 #include <iostream> using namespace std; , MAXV = ; int v, n, m, f[MAX ...

  10. 关于gradle与maven对springboot项目的配置文件加载异同

    先说下缘由吧,由于年后跳槽换了家公司,构建项目工具也有maven改成gradle了,所以在搭建框架进行开发打包过程中难免会遇到一些意想不到的问题. 本文简述下打包扫描加载配置文件的异同吧. maven ...