ios - esta - escanear codigo qr whatsapp iphone
¿Cómo puedo escanear códigos de barras en iOS? (17)
¿Cómo puedo simplemente escanear códigos de barras en iPhone y / o iPad?
A veces puede ser útil también para generar códigos QR . Hay una excelente biblioteca de C para esto que funciona como un encanto. Se llama libqrencode . Escribir una vista personalizada para mostrar el código QR no es tan difícil y se puede hacer con una comprensión básica de QuartzCore.
Al igual que con el lanzamiento de iOS7
ya no es necesario utilizar un marco externo o biblioteca. El ecosistema de iOS con AVFoundation ahora es totalmente compatible con el escaneo de casi todos los códigos de QR sobre EAN a UPC.
Simplemente eche un vistazo a la Nota técnica y la guía de programación AVFoundation. AVMetadataObjectTypeQRCode
es tu amigo.
Aquí hay un buen tutorial que lo muestra paso a paso: Biblioteca de escaneo de códigos QR de iPhone iOS7
Solo un pequeño ejemplo de cómo configurarlo:
#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];
}
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
}
Creo que esto se puede hacer usando AVFramework, aquí está el código de muestra para hacer esto
import UIKit
import AVFoundation
class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate
{
@IBOutlet weak var lblQRCodeResult: UILabel!
@IBOutlet weak var lblQRCodeLabel: UILabel!
var objCaptureSession:AVCaptureSession?
var objCaptureVideoPreviewLayer:AVCaptureVideoPreviewLayer?
var vwQRCode:UIView?
override func viewDidLoad() {
super.viewDidLoad()
self.configureVideoCapture()
self.addVideoPreviewLayer()
self.initializeQRView()
}
func configureVideoCapture() {
let objCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
var error:NSError?
let objCaptureDeviceInput: AnyObject!
do {
objCaptureDeviceInput = try AVCaptureDeviceInput(device: objCaptureDevice) as AVCaptureDeviceInput
} catch let error1 as NSError {
error = error1
objCaptureDeviceInput = nil
}
objCaptureSession = AVCaptureSession()
objCaptureSession?.addInput(objCaptureDeviceInput as! AVCaptureInput)
let objCaptureMetadataOutput = AVCaptureMetadataOutput()
objCaptureSession?.addOutput(objCaptureMetadataOutput)
objCaptureMetadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
objCaptureMetadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode]
}
func addVideoPreviewLayer() {
objCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: objCaptureSession)
objCaptureVideoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
objCaptureVideoPreviewLayer?.frame = view.layer.bounds
self.view.layer.addSublayer(objCaptureVideoPreviewLayer!)
objCaptureSession?.startRunning()
self.view.bringSubviewToFront(lblQRCodeResult)
self.view.bringSubviewToFront(lblQRCodeLabel)
}
func initializeQRView() {
vwQRCode = UIView()
vwQRCode?.layer.borderColor = UIColor.redColor().CGColor
vwQRCode?.layer.borderWidth = 5
self.view.addSubview(vwQRCode!)
self.view.bringSubviewToFront(vwQRCode!)
}
func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
if metadataObjects == nil || metadataObjects.count == 0 {
vwQRCode?.frame = CGRectZero
lblQRCodeResult.text = "QR Code wans''t found"
return
}
let objMetadataMachineReadableCodeObject = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
if objMetadataMachineReadableCodeObject.type == AVMetadataObjectTypeQRCode {
let objBarCode = objCaptureVideoPreviewLayer?.transformedMetadataObjectForMetadataObject(objMetadataMachineReadableCodeObject as AVMetadataMachineReadableCodeObject) as! AVMetadataMachineReadableCodeObject
vwQRCode?.frame = objBarCode.bounds;
if objMetadataMachineReadableCodeObject.stringValue != nil {
lblQRCodeResult.text = objMetadataMachineReadableCodeObject.stringValue
}
}
}
}
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.
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.
Hay otra opción para esto ahora si está abierto a la licencia de un SDK. Consulte el SDK de RedLaser que funciona para UPCA / EAN13 con o sin enfoque automático. Recientemente actualizado.
Soy un fundador de la startup de visión por computadora que construyó este nuevo escáner, solo para su información.
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.
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.
Para un escáner de código de barras iOS 7 nativo, eche un vistazo a mi proyecto en GitHub:
Podrías echarle un vistazo al código fuente del lector de datos DataMatrix iPhone de Stefan Hafeneger ( proyecto de código de Google , publicación de blog archivada ) si todavía está disponible.
Si la compatibilidad con el iPad 2 o iPod Touch es importante para su aplicación, elegiría un SDK de escáner de código de barras que pueda decodificar códigos de barras en imágenes borrosas, como nuestro SDK de escáner de códigos de barras Scandit para iOS y Android. La decodificación de imágenes de códigos de barras borrosas también es útil en teléfonos con cámaras de enfoque automático porque el usuario no tiene que esperar a que el enfoque automático se active.
Scandit viene con un plan de precios para la comunidad gratuito y también tiene una API de productos que facilita la conversión de números de códigos de barras en nombres de productos.
(Descargo de responsabilidad: soy cofundador de Scandit)
Verifique que ZBar lea los códigos QR y ECN / ISBN y esté disponible bajo la licencia LGPL v2.
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];
}
CÓMO: Agregar un lector de código de barras a una aplicación de iPhone , que apunte a ZBar iPhone SDK , parece útil ( de otro hilo ).
liteqr es un "Lite QR Reader en Objective C portado desde zxing" en github y tiene soporte para Xcode 4.
Creamos la aplicación ''Barcodes'' para iPhone. Puede decodificar códigos QR. El código fuente está disponible desde el proyecto zxing ; específicamente, desea echar un vistazo al cliente de iPhone y al puerto parcial de C ++ de la biblioteca central . El puerto es un poco antiguo, desde aproximadamente la versión 0.9 del código Java, pero aún debería funcionar razonablemente bien.
Si necesita escanear otros formatos, como formatos 1D, puede continuar el puerto del código Java dentro de este proyecto a C ++.
EDITAR: Los códigos de barras y el código de iphone
en el proyecto fueron retirados a principios de 2014.