Files
suixinkan_uikit/suixinkan/Common/QRCodeGenerator.swift

60 lines
2.1 KiB
Swift
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// QRCodeGenerator.swift
// suixinkan
//
import CoreImage
import UIKit
/// Android `QrCodeUtils.generateStyledQrBitmap`
enum QRCodeGenerator {
private static let defaultPixelSize = 580
private static let defaultCornerRadius: CGFloat = 24
///
static func generateStyledQRCode(
content: String,
pixelSize: Int = defaultPixelSize,
backgroundColor: UIColor = AppColor.inputBackground,
cornerRadius: CGFloat = defaultCornerRadius
) -> UIImage? {
guard !content.isEmpty,
let qrImage = makeQRCodeImage(from: content, pixelSize: pixelSize) else {
return nil
}
let size = CGSize(width: pixelSize, height: pixelSize)
let format = UIGraphicsImageRendererFormat()
format.scale = 1
let renderer = UIGraphicsImageRenderer(size: size, format: format)
return renderer.image { context in
let rect = CGRect(origin: .zero, size: size)
let path = UIBezierPath(roundedRect: rect, cornerRadius: cornerRadius)
backgroundColor.setFill()
path.fill()
context.cgContext.saveGState()
path.addClip()
qrImage.draw(in: rect)
context.cgContext.restoreGState()
}
}
private static func makeQRCodeImage(from content: String, pixelSize: Int) -> UIImage? {
guard let filter = CIFilter(name: "CIQRCodeGenerator") else { return nil }
let data = Data(content.utf8)
filter.setValue(data, forKey: "inputMessage")
filter.setValue("M", forKey: "inputCorrectionLevel")
guard let outputImage = filter.outputImage else { return nil }
let scale = CGFloat(pixelSize) / outputImage.extent.width
let scaledImage = outputImage.transformed(by: CGAffineTransform(scaleX: scale, y: scale))
let context = CIContext()
guard let cgImage = context.createCGImage(scaledImage, from: scaledImage.extent) else {
return nil
}
return UIImage(cgImage: cgImage)
}
}