首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速生成qrcode

快速生成qrcode
EN

Stack Overflow用户
提问于 2018-02-23 08:47:43
回答 4查看 4.7K关注 0票数 1

我试图生成一个qrcode,但是它有错误。

线程1:致命错误:在展开可选值时意外找到零

代码语言:javascript
复制
let myString = "ggigiuui"

let data = myString.data(using: .ascii, allowLossyConversion: false)
let filter = CIFilter(name: "CIQRCodeGenerator")
filter?.setValue(data, forKey: "inputMessage")

let img = UIImage(ciImage: (filter?.outputImage)!)

qponImage.image = img

EN

回答 4

Stack Overflow用户

发布于 2018-02-23 10:23:00

我使用了以下代码,它正在工作,perfectly.Where self.imgQRCode是要在其上显示QR的图像视图。

代码语言:javascript
复制
func generateQRCode(from string: String) -> UIImage?
    {
        let data = string.data(using: String.Encoding.ascii)

        if let filter = CIFilter(name: "CIQRCodeGenerator")
        {
            filter.setValue(data, forKey: "inputMessage")

            guard let qrImage = filter.outputImage else {return nil}
            let scaleX = self.imgQRCode.frame.size.width / qrImage.extent.size.width
            let scaleY = self.imgQRCode.frame.size.height / qrImage.extent.size.height
            let transform = CGAffineTransform(scaleX: scaleX, y: scaleY)

            if let output = filter.outputImage?.transformed(by: transform)
            {
                return UIImage(ciImage: output)
            }
        }
        return nil
    }
票数 6
EN

Stack Overflow用户

发布于 2018-02-23 08:49:27

请试试这个,

代码语言:javascript
复制
func generateQRCode(from string: String) -> UIImage? {
    let data = string.data(using: String.Encoding.ascii)

    if let filter = CIFilter(name: "CIQRCodeGenerator") {
        filter.setValue(data, forKey: "inputMessage")
        let transform = CGAffineTransform(scaleX: 3, y: 3)

        if let output = filter.outputImage?.transformed(by: transform) {
            return UIImage(ciImage: output)
        }
    }

    return nil
}
票数 3
EN

Stack Overflow用户

发布于 2019-04-12 13:25:12

这是如何生成一个QRCode并在UIImageView中显示

首先,创建新的Cocoa类 .swift文件并导入这两个框架:

代码语言:javascript
复制
import UIKit
import CoreImage

第二步,只需将扩展 of 、URL、CIImage添加到相同的.swift文件中即可。

扩展:

代码语言:javascript
复制
extension URL {

    /// Creates a QR code for the current URL in the given color.
    func qrImage(using color: UIColor, logo: UIImage? = nil) -> CIImage? {
        let tintedQRImage = qrImage?.tinted(using: color)
        guard let logo = logo?.cgImage else {
            return tintedQRImage
        }
        return tintedQRImage?.combined(with: CIImage(cgImage: logo))
    }
    
    /// Returns a black and white QR code for this URL.
    var qrImage: CIImage? {
        guard let qrFilter = CIFilter(name: "CIQRCodeGenerator") else { return nil }
        let qrData = absoluteString.data(using: String.Encoding.ascii)
        qrFilter.setValue(qrData, forKey: "inputMessage")
        let qrTransform = CGAffineTransform(scaleX: 12, y: 12)
        return qrFilter.outputImage?.transformed(by: qrTransform)
    }
}

extension CIImage {
    
    /// Inverts the colors and creates a transparent image by converting the mask to alpha.
    /// Input image should be black and white.
    var transparent: CIImage? {
        return inverted?.blackTransparent
    }
    
    /// Inverts the colors.
    var inverted: CIImage? {
        guard let invertedColorFilter = CIFilter(name: "CIColorInvert") else { return nil }
        invertedColorFilter.setValue(self, forKey: "inputImage")
        return invertedColorFilter.outputImage
    }
    
    /// Converts all black to transparent.
    var blackTransparent: CIImage? {
        guard let blackTransparentFilter = CIFilter(name: "CIMaskToAlpha") else { return nil }
        blackTransparentFilter.setValue(self, forKey: "inputImage")
        return blackTransparentFilter.outputImage
    }
    
    /// Applies the given color as a tint color.
    func tinted(using color: UIColor) -> CIImage?
    {
        guard
            let transparentQRImage = transparent,
            let filter = CIFilter(name: "CIMultiplyCompositing"),
            let colorFilter = CIFilter(name: "CIConstantColorGenerator") else { return nil }
        
        let ciColor = CIColor(color: color)
        colorFilter.setValue(ciColor, forKey: kCIInputColorKey)
        let colorImage = colorFilter.outputImage
        filter.setValue(colorImage, forKey: kCIInputImageKey)
        filter.setValue(transparentQRImage, forKey: kCIInputBackgroundImageKey)
        return filter.outputImage!
    }
    
    /// Combines the current image with the given image centered.
    func combined(with image: CIImage) -> CIImage? {
        guard let combinedFilter = CIFilter(name: "CISourceOverCompositing") else { return nil }
        let centerTransform = CGAffineTransform(translationX: extent.midX - (image.extent.size.width / 2), y: extent.midY - (image.extent.size.height / 2))
        combinedFilter.setValue(image.transformed(by: centerTransform), forKey: "inputImage")
        combinedFilter.setValue(self, forKey: "inputBackgroundImage")
        return combinedFilter.outputImage!
    }
}

第三步,您必须显示要显示生成的QRCode的图像视图的输出。

您的ViewController.swift文件如下所示。

代码语言:javascript
复制
  // desired color of QRCode
    let OrangeColor = UIColor(red:0.93, green:0.31, blue:0.23, alpha:1.00)
  // app logo or whatever UIImage you want to set in the center.
    let Logo = UIImage(named: "logo_which_you_want_to_set_in_the center_of_the_QRCode")!

    @IBOutlet weak var imgQRImage: UIImageView!

最后也是最后一步,将QRCode添加到imgQRImage中,并将代码放入您的imgQRImage中

代码语言:javascript
复制
override func viewDidLoad() {
    super.viewDidLoad()
    let QRLink = "https://www.peerbits.com/"
    guard let qrURLImage = URL(string: QRLink)?.qrImage(using: self.OrangeColor, logo: self.Logo)else{return}
    self.imgQRImage.image = UIImage(ciImage: qrURLImage)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48944184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档