我按照这个tutorial教程获得了一个带有透明背景的QR码。
添加这些扩展:
extension CIImage {
var transparent: CIImage? {
return inverted?.blackTransparent
}
var inverted: CIImage? {
guard let invertedColorFilter = CIFilter(name: "CIColorInvert") else { return nil }
invertedColorFilter.setValue(self, forKey: "inputImage")
return invertedColorFilter.outputImage
}
var blackTransparent: CIImage? {
guard let blackTransparentFilter = CIFilter(name: "CIMaskToAlpha") else { return nil }
blackTransparentFilter.setValue(self, forKey: "inputImage")
return blackTransparentFilter.outputImage
}
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!
}
}
extension URL {
func qrImage(using color: UIColor) -> UIImage? {
let ciImage = qrCIImage?.tinted(using: color)
return ciImage != nil ? UIImage(ciImage: ciImage!) : nil
}
var qrImage: UIImage? {
return UIImage(ciImage: qrCIImage!)
}
func qrCIImage(using color: UIColor) -> CIImage? {
return qrCIImage?.tinted(using: color)
}
var qrCIImage: 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)
}
}
然后像这样使用:
let myChosenColor = UIColor(red:0.93, green:0.31, blue:0.23, alpha:1.00)
let qrURLImage = URL(string: "https://stackoverflow.com")?.qrImage(using: myChosenColor)
myQrImageView.image = qrURLImage
在 myQrImageView.image 中,您将看到一个带有透明背景的二维码图像: