¿Cómo puedo escanear códigos de barras en iOS?



Answers

Verifique que ZBar lea los códigos QR y ECN / ISBN y esté disponible bajo la licencia LGPL v2.

Question

¿Cómo puedo simplemente escanear códigos de barras en iPhone y / o iPad?




Aquí hay un código simple:

func scanbarcode()
{
    view.backgroundColor = UIColor.blackColor()
    captureSession = AVCaptureSession()

    let videoCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
    let videoInput: AVCaptureDeviceInput

    do {
        videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)
    } catch {
        return
    }

    if (captureSession.canAddInput(videoInput)) {
        captureSession.addInput(videoInput)
    } else {
        failed();
        return;
    }

    let metadataOutput = AVCaptureMetadataOutput()

    if (captureSession.canAddOutput(metadataOutput)) {
        captureSession.addOutput(metadataOutput)

        metadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
        metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypePDF417Code]
    } else {
        failed()
        return
    }

    previewLayer = AVCaptureVideoPreviewLayer(session: captureSession);
    previewLayer.frame = view.layer.bounds;
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    view.layer.addSublayer(previewLayer);
    view.addSubview(closeBtn)
    view.addSubview(backimg)

    captureSession.startRunning();

}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func failed() {
    let ac = UIAlertController(title: "Scanning not supported", message: "Your device does not support scanning a code from an item. Please use a device with a camera.", preferredStyle: .Alert)
    ac.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
    presentViewController(ac, animated: true, completion: nil)
    captureSession = nil
}

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    if (captureSession?.running == false) {
        captureSession.startRunning();
    }
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)

    if (captureSession?.running == true) {
        captureSession.stopRunning();
    }
}

func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
    captureSession.stopRunning()

    if let metadataObject = metadataObjects.first {
        let readableObject = metadataObject as! AVMetadataMachineReadableCodeObject;

        AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
        foundCode(readableObject.stringValue);
    }

   // dismissViewControllerAnimated(true, completion: nil)
}

func foundCode(code: String) {
    var createAccountErrorAlert: UIAlertView = UIAlertView()
    createAccountErrorAlert.delegate = self
    createAccountErrorAlert.title = "Alert"
    createAccountErrorAlert.message = code
    createAccountErrorAlert.addButtonWithTitle("ok")
    createAccountErrorAlert.addButtonWithTitle("Retry")
    createAccountErrorAlert.show()
    NSUserDefaults.standardUserDefaults().setObject(code, forKey: "barcode")
    NSUserDefaults.standardUserDefaults().synchronize()
    ItemBarcode = code
    print(code)
}

override func prefersStatusBarHidden() -> Bool {
    return true
}

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return .Portrait
}



La cámara iPhone 4 es más que capabale de hacer códigos de barras. La biblioteca de código de barras de paso de cebra tiene un tenedor en github zxing-iphone . Es de código abierto.







puede verificar ZBarSDK para leer el código QR y los códigos ECN / ISBN, es fácil de integrar intente con el siguiente código.

- (void)scanBarcodeWithZBarScanner
  {
// ADD: present a barcode reader that scans from the camera feed
ZBarReaderViewController *reader = [ZBarReaderViewController new];
reader.readerDelegate = self;
reader.supportedOrientationsMask = ZBarOrientationMaskAll;

ZBarImageScanner *scanner = reader.scanner;
// TODO: (optional) additional reader configuration here

// EXAMPLE: disable rarely used I2/5 to improve performance
 [scanner setSymbology: ZBAR_I25
               config: ZBAR_CFG_ENABLE
                   to: 0];

//Get the return value from controller
[reader setReturnBlock:^(BOOL value) {

}

y en didFinishPickingMediaWithInfo obtenemos el valor del código de barras.

    - (void) imagePickerController: (UIImagePickerController*) reader
   didFinishPickingMediaWithInfo: (NSDictionary*) info
   {
    // ADD: get the decode results
    id<NSFastEnumeration> results =
    [info objectForKey: ZBarReaderControllerResults];
    ZBarSymbol *symbol = nil;
    for(symbol in results)
    // EXAMPLE: just grab the first barcode
    break;

    // EXAMPLE: do something useful with the barcode data
    barcodeValue = symbol.data;

    // EXAMPLE: do something useful with the barcode image
    barcodeImage =   [info objectForKey:UIImagePickerControllerOriginalImage];
    [_barcodeIV setImage:barcodeImage];

    //set the values for to TextFields
    [self setBarcodeValue:YES];

    // ADD: dismiss the controller (NB dismiss from the *reader*!)
    [reader dismissViewControllerAnimated:YES completion:nil];
   }



El problema con la cámara de iPhone es que los primeros modelos (de los cuales hay toneladas en uso) tienen una cámara de foco fijo que no puede tomar imágenes enfocadas para distancias menores de 2 pies. Las imágenes son borrosas y distorsionadas y, si se toman desde una distancia mayor, no hay suficientes detalles / información del código de barras.

Algunas compañías han desarrollado aplicaciones para iPhone que pueden adaptarse a eso mediante el uso de tecnologías avanzadas de desenfoque. Esas aplicaciones que puedes encontrar en la tienda de aplicaciones de Apple: pic2shop, RedLaser y ShopSavvy. Todas las empresas han anunciado que también tienen SDK disponibles, algunos de forma gratuita o muy preferencial, verifique uno.




No estoy seguro si esto ayudará, pero aquí hay un enlace a una biblioteca de códigos QR de código abierto. Como puede ver, un par de personas ya han usado esto para crear aplicaciones para el iphone.

Wikipedia tiene un artículo explicando qué códigos QR son . En mi opinión, los códigos QR son mucho más adecuados para el propósito que el código de barras estándar en lo que respecta al iPhone, ya que fue diseñado para este tipo de implementación.




Hay dos bibliotecas principales:

  • ZXing una biblioteca escrita en Java y luego portada a Objective C / C ++ (solo código QR). Y otro puerto para ObjC ha sido hecho por TheLevelUp: github.com/TheLevelUp/ZXingObjC

  • ZBar es un software de código abierto para leer códigos de barras, basado en C.

De acuerdo con mis experimentos, ZBar es mucho más preciso y rápido que ZXing, al menos en iPhone.






Links