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对应的代码考到自己 ...
 
随机推荐
- html解析过程
			
Web页面运行在各种各样的浏览器当中,浏览器载入.渲染页面的速度直接影响着用户体验 简单地说,页面渲染就是浏览器将html代码根据CSS定义的规则显示在浏览器窗口中的这个过程.先来大致了解一下浏览器都 ...
 - react-native start 启动错误解决方法
			
ERROR Error watching file for changes: EMFILE {"code":"EMFILE","errno" ...
 - 《自动化平台测试开发-Python测试开发实战》第2次印刷
			
书籍货源比较紧张.紧张啊,如此短的时间,已经第2次印刷.第2次印刷. 第2次印刷. 同时该书已确认与台湾出版社合作翻译成繁体版,甚至有可能与国外出版社合作翻译成英文版. 2018年7月 第1次印刷 2 ...
 - MDEV入门
			
------------- MDEV入门------------- 对于我们这些人知道如何使用的mdev ,底漆可能似乎跛.为其他人的mdev是一个神秘的黑匣子,他们听到的是真棒,但不能似乎得到他们的 ...
 - ReadHub项目Kotlin版开发指南(三、MVP架构)
			
ReadHub项目Kotlin版转换指南(一.环境搭建) ReadHub项目Kotlin版转换指南(二.数据库和网络请求) ReadHub项目Kotlin版转换指南(三.MVP架构) Android ...
 - 代码演示C#各版本新功能
			
代码演示C#各版本新功能 C#各版本新功能其实都能在官网搜到,但很少有人整理在一起,并通过非常简短的代码将每个新特性演示出来. 代码演示C#各版本新功能 C# 2.0版 - 2005 泛型 分部类型 ...
 - Android中使用AsyncTask
			
>##今天写作业用到了AnsyncTask,记录一下自己的使用情况 >###1.Android.os.AsyncTask类 > 1.AsyncTask类对线程间通讯进行了包装,我们 ...
 - Python学习笔记--threading线程
			
通过线程来实现多任务并发.提高性能.先看看例子. #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2020-03-02 21:10:39 ...
 - 从0到1,本地到远程git程序过程
			
从0到1,本地到远程git程序过程 切记一定要在需要提交代码的文件夹下git init,既是你使用了什么 tortoisegit什么工具,或者你在idea环境下已经add了,但是仍然需要你在当前文件夹 ...
 - .NET平台编程语言的衰败
			
.NET平台编程语言的衰败 JVM上的编程语言除了Java,其它还有很多,比如最近谷歌公司力捧JVM平台上的语言Kotlin.大数据用的Scala.构建系统用的Groovy..NET平台上的编程语言曾 ...