ios swift barcode scanner
¿Cómo puedo generar un código de barras a partir de una cadena en Swift? (3)
Código mejorado:
- Escalado de código de barras
- Establecer margen de imagen de código de barras
- Convierta el UIImage a NSData (por alguna razón no fue posible con el código anterior).
- No fallará al compartir la imagen de código de barras (probablemente debido al mismo error)
Swift 3
func generateBarcode(from string: String) -> UIImage? {
let data = string.data(using: String.Encoding.ascii)
if let filter = CIFilter(name: "CICode128BarcodeGenerator") {
filter.setDefaults()
//Margin
filter.setValue(7.00, forKey: "inputQuietSpace")
filter.setValue(data, forKey: "inputMessage")
//Scaling
let transform = CGAffineTransform(scaleX: 3, y: 3)
if let output = filter.outputImage?.applying(transform) {
let context:CIContext = CIContext.init(options: nil)
let cgImage:CGImage = context.createCGImage(output, from: output.extent)!
let rawImage:UIImage = UIImage.init(cgImage: cgImage)
//Refinement code to allow conversion to NSData or share UIImage. Code here:
//http://stackoverflow.com/questions/2240395/uiimage-created-from-cgimageref-fails-with-uiimagepngrepresentation
let cgimage: CGImage = (rawImage.cgImage)!
let cropZone = CGRect(x: 0, y: 0, width: Int(rawImage.size.width), height: Int(rawImage.size.height))
let cWidth: size_t = size_t(cropZone.size.width)
let cHeight: size_t = size_t(cropZone.size.height)
let bitsPerComponent: size_t = cgimage.bitsPerComponent
//THE OPERATIONS ORDER COULD BE FLIPPED, ALTHOUGH, IT DOESN''T AFFECT THE RESULT
let bytesPerRow = (cgimage.bytesPerRow) / (cgimage.width * cWidth)
let context2: CGContext = CGContext(data: nil, width: cWidth, height: cHeight, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: CGColorSpaceCreateDeviceRGB(), bitmapInfo: cgimage.bitmapInfo.rawValue)!
context2.draw(cgimage, in: cropZone)
let result: CGImage = context2.makeImage()!
let finalImage = UIImage(cgImage: result)
return finalImage
}
}
return nil
}
Soy un nuevo desarrollador de iOS. Me preguntaba cómo puedo generar un código de barras en Swift.
Ya tengo el código, hay varios recursos para aprender a leer un código de barras, pero no encontré ninguno que habla sobre cómo generar uno a partir de una cadena.
¡Muchas gracias!
PD: Sé que hay una pregunta similar sobre esto, pero es para Objective-C. No sé Obj-C y me resulta difícil venir de .NET.
Si su destino de implementación es al menos iOS 8, puede usar Core Image. Aquí está mi clase BarcodeGenerator (necesitas import CoreImage
):
class BarcodeGenerator {
enum Descriptor: String {
case code128 = "CICode128BarcodeGenerator"
case pdf417 = "CIPDF417BarcodeGenerator"
case aztec = "CIAztecCodeGenerator"
case qr = "CIQRCodeGenerator"
}
class func generate(from string: String,
descriptor: Descriptor,
size: CGSize) -> CIImage? {
let filterName = descriptor.rawValue
guard let data = string.data(using: .ascii),
let filter = CIFilter(name: filterName) else {
return nil
}
filter.setValue(data, forKey: "inputMessage")
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)
return scaledImage
}
}
Se puede usar así.
BarcodeGenerator.generate(from: "barcode-string",
symbology: .code128,
size: CGSize(width: 800, height: 300))
¡Puedes usar un filtro CoreImage ( import CoreImage
) para hacer eso!
class Barcode {
class func fromString(string : String) -> UIImage? {
let data = string.data(using: .ascii)
let filter = CIFilter(name: "CICode128BarcodeGenerator")
filter?.setValue(data, forKey: "inputMessage")
return UIImage(ciImage: (filter?.outputImage)!)
}
}
let img = Barcode.fromString("whateva")
Según los docs :
Genera una imagen de salida que representa los datos de entrada de acuerdo con la norma ISO / IEC 15417: 2007. El ancho de cada módulo (línea vertical) del código de barras en la imagen de salida es de un píxel. La altura del código de barras es de 32 píxeles. Para crear un código de barras a partir de una cadena o URL, conviértalo en un objeto NSData utilizando la codificación de cadena NSASCIIStringEncoding.