iOS 原生实现生成二维码(CoreImage)工具类,不依赖第三方库,可自定义背景颜色,添加logo(Swift 4.0)
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)的更多相关文章
- iOS原生CIFilter创建二维码
iOS原生CIFilter创建二维码 2016-05-31 未来C iOS原生CIFilter创建二维码 关于二维码生成,网上也是有很多,很早以前的第三方库大多数都是通过C++写,也是有的如zxing ...
- IOS原生方法实现二维码生成与扫描
转自:http://www.jianshu.com/p/d6663245d3fa 二维码的生成有好多第三方库,如Z-Xing.但是为了控制安装包的大小,或者并不需要其他的一些额外的功能,用系统的方法即 ...
- iOS开发之生成二维码
一.二维码的生成 从iOS7开始集成了二维码的生成和读取功能 此前被广泛使用的zbarsdk目前不支持64位处理器 1.二维码的内容(传统的条形码只能放数字) 纯文本 名片 URL 2.生成二 ...
- iOS 根据url生成二维码贴到底图上
根据url 生成指定尺寸的二维码图片 UIImage * createBinaryCodeImg(const char * url ,CGFloat size) { //create binary c ...
- iOS 原生库(AVFoundation)实现二维码扫描,封装的工具类,不依赖第三方库,可高度自定义扫描动画及界面(Swift 4.0)
Create QRScanner.swift file // // QRScanner.swift // NativeQR // // Created by Harvey on 2017/10/24. ...
- 生成二维码 加密解密类 TABLE转换成实体、TABLE转换成实体集合(可转换成对象和值类型) COOKIE帮助类 数据类型转换 截取字符串 根据IP获取地点 生成随机字符 UNIX时间转换为DATETIME\DATETIME转换为UNIXTIME 是否包含中文 生成秘钥方式之一 计算某一年 某一周 的起始时间和结束时间
生成二维码 /// <summary>/// 生成二维码/// </summary>public static class QRcodeUtils{private static ...
- firefox 最新版地址栏后没有生成二维码的工具
下载火狐离线安装包50.0.2版本,安装后找不到这个图标了,搜索下载附加组件管理器cpmanager-1.2.13.xpi,提示没有签名无法安装,最后下载了一个较高版本的cpmanager-1.5.5 ...
- 把url链接转换成二维码的工具类
import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io ...
- iOS开发——生成二维码——工具类
啥也不说,直接上源码,拷过去就能用.生成二维码的工具类使用方法在ProduceQRCode.h里有示例说明 分别将下面的ProduceQRCode.h和ProduceQRCode.m对应的代码考到自己 ...
随机推荐
- 转: zabbix对cisco2960的监控
转自:http://blog.chinaunix.net/uid-12115233-id-3561954.html 1:首先在官网下载Cisco2950 模板https://www.zabbix.co ...
- vue基础指令了解补充及组件介绍
v-once指令 """ v-once:单独使用,限制的标签内容一旦赋值,便不可被动更改(如果是输入框,可以主动修改) """ <di ...
- 3名程序员被抓!开发“万能钥匙”APP,撬走3个亿
来自:程序员头条 报道 又有 3 名程序员被抓!开发"万能钥匙"APP,撬走 3 亿! 前几天,据央视新闻报道,上海公安机关接到共享单车企业报案,随后破获了一起共享单车万能解锁 A ...
- Cisco2960 交换机密码破解方法
1. 启用超级终端并出现连接界面2. 拔掉交换机的电源3. 按下交换机上的 Mode按钮, 与此同时重新插上交换机的电源线4. 当交换机左边的sys 灯会慢慢的闪动, ( 细心的话会发现部分灯红色的闪 ...
- es6this箭头函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 < ...
- percona-toolkit 之 【pt-query-digest】介绍
背景: 做为一个MySQL DBA,分析慢查询是日常主要的工作之一,之前一直使用mysqlsla作为分析慢查询的, 因为简单并且也能满足自己对慢查询分析的要求,对于另一个工具pt-query-dige ...
- 目标用户偏好指数Target Group Index分析
目标用户偏好指数Target Group Index分析 TGI指数,全称Target Group Index,可以反映目标群体在特定研究范围内强势或者弱势. TGI指数计算公式 = 目标群体中具有某 ...
- 压力测试(四)-Mysql数据库压测实操
1.Jmeter压测实战之JDBC request压测Mysql讲解 简介:讲解jdbc压测mysql相关准备工作,jar包添加,配置讲解 1.Thread Group -> add -> ...
- Web图片资源的加载与渲染时机
此文研究页面中的图片资源的加载和渲染时机,使得我们能更好的管理图片资源,避免不必要的流量和提高用户体验. 浏览器的工作流程 要研究图片资源的加载和渲染,我们先要了解浏览器的工作原理.以Webkit引擎 ...
- Parcel上手——又一个打包工具
Parcel是什么? 极速零配置Web应用打包工具 说到打包工具,大多人应该都用过Webpack,Parcel也是这一类工具. Parcel相比Webpack有什么优势? 配置简单 打包速度快 以下是 ...