secant-ios-wallet/secant/Utils/QRCodeGenerator.swift

46 lines
1.3 KiB
Swift

//
// QRCodeGenerator.swift
// secant-testnet
//
// Created by Lukáš Korba on 04.07.2022.
//
import Foundation
import Combine
import CoreImage.CIFilterBuiltins
import SwiftUI
enum QRCodeGenerator {
enum QRCodeError: Error {
case failedToGenerate
}
static func generate(from string: String) -> Future<CGImage, QRCodeError> {
Future<CGImage, QRCodeError> { promise in
DispatchQueue.global().async {
guard let image = generate(from: string) else {
promise(.failure(QRCodeGenerator.QRCodeError.failedToGenerate))
return
}
return promise(.success(image))
}
}
}
static func generate(from string: String, scale: CGFloat = 5) -> CGImage? {
let data = string.data(using: String.Encoding.utf8)
let context = CIContext()
let filter = CoreImage.CIFilter.qrCodeGenerator()
filter.setValue(data, forKey: "inputMessage")
let transform = CGAffineTransform(scaleX: scale, y: scale)
guard let output = filter.outputImage?.transformed(by: transform) else {
return nil
}
return context.createCGImage(output, from: output.extent)
}
}