Hi I am working on an iOS project i want to generate a customised QR code but have no idea how to do it. I am attaching a sample also.
i want to generate a QR Code Like this in Swift Language. Thanks
Hi I am working on an iOS project i want to generate a customised QR code but have no idea how to do it. I am attaching a sample also.
i want to generate a QR Code Like this in Swift Language. Thanks
Here is the code for generating the QR code with logo image in centre:
import UIKit
import EventKit
import CoreImage
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
guard let qrURLImage = URL(string: "https://www.thepramodkumar.com/")?.qrImage(using: #colorLiteral(red: 0.3490196078, green: 0.768627451, blue: 0.6823529412, alpha: 1), logo: #imageLiteral(resourceName: "logo")) else { return }
imageView.image = qrURLImage
}
}
extension URL {
/// Creates a QR code for the current URL in the given color.
func qrImage(using color: UIColor, logo: UIImage? = nil) -> UIImage? {
guard let tintedQRImage = qrImage?.tinted(using: color) else {
return nil
}
guard let logo = logo?.cgImage else {
return UIImage(ciImage: tintedQRImage)
}
guard let final = tintedQRImage.combined(with: CIImage(cgImage: logo)) else {
return UIImage(ciImage: tintedQRImage)
}
return UIImage(ciImage: final)
}
/// 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!
}
}
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!
}
}
Github Repo : https://github.com/bestiosdeveloper/QACodeDemo
func generateQRCode(from string: String) -> UIImage? {
let data = string.data(using: .ascii, allowLossyConversion: false)
let filter = CIFilter(name: "CIQRCodeGenerator")
filter?.setValue(data, forKey: "inputMessage")
let img = UIImage(cgImage: CIContext(options: nil).createCGImage((filter?.outputImage!)!, from: (filter?.outputImage!.extent)!)!)
return img
}
You could achieve the same using CIFilter, CGAffineTransform https://developer.apple.com/documentation/coreimage/cifilter https://developer.apple.com/documentation/coregraphics/cgaffinetransform
Sample code
func genQRCode(from input: String) -> UIImage? {
let data = input.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
}
let image = generateQRCode(from: "Sample code to generate QR")