Como posso digitalizar códigos de barras no iOS?



ion title position (12)

Como posso simplesmente digitalizar códigos de barras no iPhone e / ou iPad?

https://ffff65535.com


Às vezes pode ser útil também para gerar códigos QR . Há uma biblioteca C excelente para isso que funciona como um encanto. É chamado libqrencode . Escrever uma visualização personalizada para exibir o código QR não é tão difícil e pode ser feito com uma compreensão básica do QuartzCore.


A câmera do iPhone 4 é mais do que capabale de fazer códigos de barras. A biblioteca de código de barras da passadeira de pedestres tem um garfo no github zxing-iphone . É de código aberto.


Como no lançamento do iOS7 você não precisa mais usar uma estrutura ou biblioteca externa. O ecossistema iOS com o AVFoundation agora suporta totalmente a digitalização de quase todos os códigos, de QR sobre EAN a UPC.

Basta dar uma olhada no Tech Note e no guia de programação AVFoundation. AVMetadataObjectTypeQRCode é seu amigo.

Aqui está um bom tutorial que mostra passo a passo: iPhone biblioteca de varredura de código QR iOS7

Apenas um pequeno exemplo sobre como configurá-lo:

#pragma mark -
#pragma mark AVFoundationScanSetup

- (void) setupScanner;
{
    self.device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    self.input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];

    self.session = [[AVCaptureSession alloc] init];

    self.output = [[AVCaptureMetadataOutput alloc] init];
    [self.session addOutput:self.output];
    [self.session addInput:self.input];

    [self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    self.output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];

    self.preview = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
    self.preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
    self.preview.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);

    AVCaptureConnection *con = self.preview.connection;

    con.videoOrientation = AVCaptureVideoOrientationLandscapeLeft;

    [self.view.layer insertSublayer:self.preview atIndex:0];
}

Confira ZBar lê códigos QR e ECN / ISBN e está disponível sob a licença LGPL v2.


Existem duas grandes bibliotecas:

  • ZXing uma biblioteca escrita em Java e depois portada para Objective C / C ++ (somente código QR). E uma outra porta para ObjC foi feita, por TheLevelUp: github.com/TheLevelUp/ZXingObjC

  • ZBar um software de código aberto para leitura de códigos de barras, baseado em C.

De acordo com minhas experiências, o ZBar é muito mais preciso e rápido que o ZXing, pelo menos no iPhone.


Não tenho certeza se isso vai ajudar, mas aqui está um link para uma biblioteca de código QR de código aberto. Como você pode ver, algumas pessoas já usaram isso para criar aplicativos para o iPhone.

A Wikipedia tem um artigo explicando o que são códigos QR . Na minha opinião, os QR Codes são muito mais adequados ao propósito do que o código de barras padrão, no que diz respeito ao iPhone, já que foi projetado para esse tipo de implementação.



Produzimos o aplicativo 'Barcodes' para o iPhone. Pode decodificar QR Codes. O código fonte está disponível no projeto zxing ; especificamente, você quer dar uma olhada no cliente do iPhone e na porta C ++ parcial da biblioteca principal . A porta é um pouco antiga, por volta da versão 0.9 do código Java, mas ainda deve funcionar razoavelmente bem.

Se você precisar varrer outros formatos, como os formatos 1D, poderá continuar a porta do código Java neste projeto para C ++.

EDIT: código de barras e o código do iphone no projeto foram retirados por volta do início de 2014.


Se você está desenvolvendo para iOS> 10.2 com o Swift 4, então você pode tentar a minha solução. Eu misturei this e this tutorial e veio com um ViewController que varre um QR Code e print() . Eu também tenho um interruptor na minha interface do usuário para alternar a luz da câmera, pode ser útil também. Por enquanto eu só testei em um iPhone SE, por favor, deixe-me saber se ele não funciona em iPhones mais recentes.

Aqui está:

import UIKit
import AVFoundation

class QRCodeScanner: UIViewController, AVCaptureMetadataOutputObjectsDelegate {

    let captureSession: AVCaptureSession = AVCaptureSession()
    var videoPreviewLayer: AVCaptureVideoPreviewLayer?
    let qrCodeFrameView: UIView = UIView()
    var captureDevice: AVCaptureDevice?

    override func viewDidLoad() {
        // Get the back-facing camera for capturing videos
        let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera, .builtInDualCamera], mediaType: AVMediaType.video, position: .back)

        captureDevice = deviceDiscoverySession.devices.first
        if captureDevice == nil {
            print("Failed to get the camera device")
            return
        }

        do {
            // Get an instance of the AVCaptureDeviceInput class using the previous device object.
            let input = try AVCaptureDeviceInput(device: captureDevice!)

            // Set the input device on the capture session.
            captureSession.addInput(input)

            // Initialize a AVCaptureMetadataOutput object and set it as the output device to the capture session.
            let captureMetadataOutput = AVCaptureMetadataOutput()
            captureSession.addOutput(captureMetadataOutput)

            // Set delegate and use the default dispatch queue to execute the call back
            captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
            captureMetadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]

            // Initialize the video preview layer and add it as a sublayer to the viewPreview view's layer.

            videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)

            if let videoPreviewLayer = videoPreviewLayer {
                videoPreviewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
                videoPreviewLayer.frame = view.layer.bounds
                view.layer.addSublayer(videoPreviewLayer)

                // Start video capture.
                captureSession.startRunning()

                if let hasFlash = captureDevice?.hasFlash, let hasTorch = captureDevice?.hasTorch {
                    if hasFlash && hasTorch {
                        view.bringSubview(toFront: bottomBar)
                        try captureDevice?.lockForConfiguration()
                    }
                }
            }

            // QR Code Overlay
            qrCodeFrameView.layer.borderColor = UIColor.green.cgColor
            qrCodeFrameView.layer.borderWidth = 2
            view.addSubview(qrCodeFrameView)
            view.bringSubview(toFront: qrCodeFrameView)

        } catch {
            // If any error occurs, simply print it out and don't continue any more.
            print("Error: \(error)")
            return
        }
    }

    // MARK: Buttons and Switch

    @IBAction func switchFlashChanged(_ sender: UISwitch) {
        do {
            if sender.isOn {
                captureDevice?.torchMode = .on
            } else {
                captureDevice?.torchMode = .off
            }
        }
    }

    // MARK: AVCaptureMetadataOutputObjectsDelegate

    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {

        // Check if the metadataObjects array is not nil and it contains at least one object.
        if metadataObjects.count == 0 {
            qrCodeFrameView.frame = CGRect.zero
            return
        }

        // Get the metadata object.
        let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject

        if metadataObj.type == AVMetadataObject.ObjectType.qr {
            // If the found metadata is equal to the QR code metadata then update the status label's text and set the bounds
            let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj)
            qrCodeFrameView.frame = barCodeObject!.bounds

            print("QR Code: \(metadataObj.stringValue)")
        }
    }
}


você pode verificar o ZBarSDK para ler os códigos QR Code e ECN / ISBN. É simples de integrar. Tente o seguinte 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) {

}

e em didFinishPickingMediaWithInfo obtemos o valor do 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];
   }





barcode