public enum CodeDescriptor: String {
case qrCpde = "CIQRCodeGenerator"
case code128Barcod = "CICode128BarcodeGenerator"
case pdf417 = "CIPDF417BarcodeGenerator"
case aztec = "CIAztecCodeGenerator"
}
enum CodeKey:String{
case inputMessage = "inputMessage"
case inputCorrectionLevel = "inputCorrectionLevel"
}
public enum CorrectionLevel{
case L
case M
case Q
case H
case aztecLevel(_ value:Int)
var levelValue:String{
switch self {
case .L:
return "L"
case .M:
return "M"
case .Q:
return "Q"
case .H:
return "H"
default:return "" }
}
}
生成二維碼
open class func generate(string: String,descriptor: CodeDescriptor,size: CGSize,color:UIColor? = nil,level:CorrectionLevel = .M) -> UIImage? {
guard let data = string.data(using: .utf8),let filter = CIFilter(name: descriptor.rawValue) else {
return nil
}
filter.setValue(data, forKey: CodeKey.inputMessage.rawValue)
if (descriptor == .qrCpde || descriptor == .pdf417){
switch level {
case .L,.M,.Q,.H:
filter.setValue(level.levelValue, forKey: CodeKey.inputCorrectionLevel.rawValue)
default:break
}
}else if descriptor == .aztec{
switch level {
case .aztecLevel(var value):
if value < 5 {
value = 5
}else if value > 95{
value = 95
}
filter.setValue(NSNumber.init(value: value), forKey: CodeKey.inputCorrectionLevel.rawValue)
default:break
}
}
guard let image = filter.outputImage else {
return nil
}
let imageSize = image.extent.size
let transform = CGAffineTransform(scaleX: size.width / imageSize.width,y: size.height / imageSize.height)
let scaledImage = image.transformed(by: transform)
guard let codeColor = color else{
return UIImage.init(ciImage: scaledImage)
}
let colorFilter = CIFilter(name: "CIFalseColor", parameters: ["inputImage":scaledImage,"inputColor0":CIColor(cgColor: codeColor.cgColor ),"inputColor1":CIColor(cgColor: UIColor.clear.cgColor)])
guard let newOutPutImage = colorFilter?.outputImage else {
return UIImage.init(ciImage: scaledImage)
}
return UIImage.init(ciImage: newOutPutImage)
}
給二維碼中間添加icon
open class func fillImage(_ inputImage:UIImage?,_ fillImage:UIImage?,_ fillSize:CGSize) -> UIImage? {
guard let input = inputImage,let fill = fillImage else {
return inputImage
}
let imageSize = input.size
UIGraphicsBeginImageContext(imageSize)
input.draw(in: CGRect.init(x: 0, y: 0, width: imageSize.width, height: imageSize.height))
let fillWidth = min(imageSize.width, fillSize.width)
let fillHeight = min(imageSize.height, fillSize.height)
let fillRect = CGRect(x: (imageSize.width - fillWidth)/2, y: (imageSize.height - fillHeight)/2, width: fillWidth ,height: fillHeight)
fill.draw(in: fillRect)
guard let newImage = UIGraphicsGetImageFromCurrentImageContext() else {
UIGraphicsEndImageContext()
return inputImage
}
UIGraphicsEndImageContext()
return newImage
}