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

原创 2018年04月17日 12:18:33
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
}

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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yao1500/article/details/79973002

C#Winform报表与打印技术——自定义报表的实现

本课程详细讲解在C#Winform程序里,对DataGridView展示的数据进行自定义报表格式的设计、预览、打印如何实现
  • 2018年03月18日 12:03

【iOS】CoreImage原生二维码生成(一)

在几个月前写过一篇关于二维码读取的博客,《【iOS】AVFoundation架构下的原生二维码和条形码扫描》。今天记录下原生的二维码的生成(今天先写一部分,生成不带logo的二维码)。 生成二维码就不...
  • zhuming3834
  • zhuming3834
  • 2016-03-09 10:19:11
  • 6644

【iOS】CoreImage原生二维码生成(二)一个方法生成带logo的二维码

在上一篇中介绍了怎么生成二维码:《【iOS】CoreImage原生二维码生成(一)》。这一篇说说怎么生成带logo的二维码。 这里的思路是,在生成的二维码的中心加一个logo图片。这里的难点就是怎么在...
  • zhuming3834
  • zhuming3834
  • 2016-03-09 15:30:15
  • 5554

iOS8 Core Image In Swift:自动改善图像以及内置滤镜的使用

Core Image是一个很强大的框架。它可以让你简单地应用各种滤镜来处理图像,比如修改鲜艳程度, 色泽, 或者曝光。 它利用GPU(或者CPU)来非常快速、甚至实时地处理图像数据和视频的帧。并且隐藏...
  • zhangao0086
  • zhangao0086
  • 2014-09-06 23:33:29
  • 21531

Java二维码工具类(使用zxing实现,可支持logo)

Java二维码工具类
  • wangnan537
  • wangnan537
  • 2015-12-18 17:42:44
  • 8483

core image几个滤镜例子 oc版本和swift版本

ios core image 常用的滤镜模式
  • xiaopingping1234567
  • xiaopingping1234567
  • 2016-03-10 15:12:11
  • 1186

自定义生成二维码,可添加logo

在敲代码之前要记得导入jar包 core-3.2.1.jar 复制百度搜索就可以下载得到 package com.gss.zxingdemo; import android.content.I...
  • PowerSen
  • PowerSen
  • 2017-10-09 18:33:33
  • 412

转:java二维码工具类,中间带LOGO的,很强大

package com.util.cccm; import java.awt.BasicStroke; import java.awt.Graphics; import java.awt.Graph...
  • mmm333zzz
  • mmm333zzz
  • 2013-12-11 10:47:12
  • 25042

【iOS开发】二维码生成 二维码读取 (带Logo的二维码)

加入QrCodeImage.h QrCodeImage.m 到工程中。 // // QrCodeImage.h // matchPlus // // Created by mnn on 16/...
  • github_34226645
  • github_34226645
  • 2016-04-14 21:58:33
  • 1247

oc和swift实现coreimage的部分常用滤镜

  • 2016年03月11日 09:27
  • 242KB
  • 下载
收藏助手
不良信息举报
您举报文章:iOS 原生实现生成二维码(CoreImage)工具类,不依赖第三方库,可自定义背景颜色,添加logo(Swift 4.0)
举报原因:
原因补充:

(最多只允许输入30个字)