extension CIImage {
/// 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!
}
}
/// 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)
}
I created the qr code in the color I want, but when I put the logo, the logo comes over the qr code and a very ugly image is formed. As in the first picture.How can I create a space in the middle of the qr and put the logo in that space?
private func configureQrCode() {
let qrCodeColor = UIColor.qrColor
let qrCodeLogo = UIImage(named: "signinlogo")
guard let qrURLImage = URL(string: QRCodeConstants.qrLink)?.qrImage(using: qrCodeColor, logo: qrCodeLogo) else { return }
qrCode.image = UIImage(ciImage: qrURLImage)
}
[![][1]][1] [![I want it to look like this, but it's like the one above][2]][2]