使用CIImage-Swift的QR码生成器

时间:2017-07-02 13:43:07

标签: ios iphone swift xcode core-image

我有一个自定义QR码生成器,现在非常简单。但是,我想做两件事。

  1. 更改QR码的颜色
  2. 更改各个方块的形状(例如圆角)
  3. 如果有人熟悉自定义QR代码生成,如果您能提供帮助,我会非常高兴。这是生成器函数的代码:

    func generateQRCode() {
            var urlString = Twitter.sharedInstance.firebaseDownloadLink?.absoluteString
            if let rangeOfHTTPS = urlString?.range(of: "https://") {
                urlString?.removeSubrange(rangeOfHTTPS)
            }
            guard var safeString = urlString else {
                return
            }
            safeString = "https://www.twitter.com/card?"+safeString
            log.info("encoded link: \(safeString)")
    
            let data = safeString.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?.applying(transform) {
                    let qrCode = UIImage(ciImage: output)
    
                    //let rawImageRef: CGImage = qrCode.cgImage!
    
                    let colorMasking: [CGFloat] = [222, 255, 222, 255, 222, 255]
                    UIGraphicsBeginImageContext(qrCode.size)
                    var rawImageRef: CGImage = CIContext.init(options: nil).createCGImage(output, from: output.extent)!
                    let maskedImageRef = rawImageRef.copy(maskingColorComponents: colorMasking)
                    UIGraphicsGetCurrentContext()?.translateBy(x: 0.0, y: qrCode.size.height)
                    UIGraphicsGetCurrentContext()!.scaleBy(x: 1.0, y: -1.0)
                    UIGraphicsGetCurrentContext()?.draw(maskedImageRef!, in: CGRect(x: 0, y: 0, width: qrCode.size.width, height: qrCode.size.height))
                    let result = UIGraphicsGetImageFromCurrentImageContext()
                    UIGraphicsEndImageContext()
    
                    qrCodeView = UIImageView(image: result)
                    self.backgroundImage.addSubview(qrCodeView!)
                    qrCodeView!.frame = CGRect(x: 96, y: 125, width: 180, height: 180)
                }
            }
        }
    

    非常感谢任何帮助。非常感谢提前!

    干杯,Theo

1 个答案:

答案 0 :(得分:2)

我有一部分解决方案。我将解释我所拥有的内容,以便您可以更进一步。我相信使用CIFilter是一个死胡同,因为它只给你最终的图像然后你必须回去解构它并修改它。对于像颜色这样的简单更改,这很容易,但是将每个框更改为其他内容非常困难。

因此,您可以使用开源库来获取QR码的实际位图,而不是使用CIFilter。如果您查看IOS的QR代码库,他们中的大多数使用CIFilter - 这不是我们想要的。我发现https://github.com/moqod/ios-qr-code-encoder实际上使用了一个真正生成QR码数据的库。

我能够修改它,为每个盒子(而不是盒子)绘制一个我选择的图像,并且能够获得非常好的结果。当我有机会上传代码更改时,但老实说这并不难,任何人都应该能够做到。

就快速做到这一点,我认为这不是一个大问题。有一些已知的方法可以将Objective-c代码与swift联系起来,因此它应该是可行的。