我有一个自定义QR码生成器,现在非常简单。但是,我想做两件事。
如果有人熟悉自定义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
答案 0 :(得分:2)
我有一部分解决方案。我将解释我所拥有的内容,以便您可以更进一步。我相信使用CIFilter
是一个死胡同,因为它只给你最终的图像然后你必须回去解构它并修改它。对于像颜色这样的简单更改,这很容易,但是将每个框更改为其他内容非常困难。
因此,您可以使用开源库来获取QR码的实际位图,而不是使用CIFilter
。如果您查看IOS的QR代码库,他们中的大多数使用CIFilter
- 这不是我们想要的。我发现https://github.com/moqod/ios-qr-code-encoder实际上使用了一个真正生成QR码数据的库。
我能够修改它,为每个盒子(而不是盒子)绘制一个我选择的图像,并且能够获得非常好的结果。当我有机会上传代码更改时,但老实说这并不难,任何人都应该能够做到。
就快速做到这一点,我认为这不是一个大问题。有一些已知的方法可以将Objective-c代码与swift联系起来,因此它应该是可行的。