ios - मैं आईओएस पर बारकोड स्कैन कैसे कर सकता हूं?




iphone ipad (12)

आईफोन 4 कैमरा बारकोड करने की क्षमता से अधिक है। ज़ेबरा क्रॉसिंग बारकोड लाइब्रेरी में जिथब zxing-iphone पर एक कांटा है। यह खुला स्रोत है।

मैं आईफोन और / या आईपैड पर बारकोड स्कैन कैसे कर सकता हूं?


आईफोन कैमरे के साथ समस्या यह है कि पहले मॉडल (जिनमें से बहुत सारे उपयोग में हैं) में फिक्स्ड फोकस कैमरा है जो 2 फीट के नीचे दूरी के लिए तस्वीर को ध्यान में रख सकता है। छवियां धुंधली और विकृत हैं और अगर अधिक दूरी से ली गई है तो बारकोड से पर्याप्त जानकारी / जानकारी नहीं है।

कुछ कंपनियों ने आईफोन ऐप विकसित किए हैं जो उन्नत डी-ब्लरिंग तकनीकों का उपयोग करके इसके लिए समायोजित कर सकते हैं। ऐप्पल ऐप स्टोर पर आप जिन अनुप्रयोगों को पा सकते हैं: pic2shop, RedLaser और ShopSavvy। सभी कंपनियों ने घोषणा की है कि उनके पास एसडीके भी उपलब्ध हैं - कुछ मुफ्त या बहुत तरजीही शर्तों के लिए, इसे एक चेक आउट करें।


कभी-कभी यह क्यूआर कोड उत्पन्न करने के लिए भी उपयोगी हो सकता है। इसके लिए एक शानदार सी लाइब्रेरी है जो एक आकर्षण की तरह काम करती है। इसे libqrencode कहा जाता है। क्यूआर कोड प्रदर्शित करने के लिए एक कस्टम व्यू लिखना तब मुश्किल नहीं है और क्वार्ट्जकोर की बुनियादी समझ के साथ किया जा सकता है।


दो प्रमुख पुस्तकालय हैं:

  • जावा में लिखी गई लाइब्रेरी ZXing और फिर उद्देश्य सी / सी ++ (केवल क्यूआर कोड) पर पोर्ट किया गया। और ओब्जेसी के लिए एक अन्य बंदरगाह किया गया है, TheLevelUp द्वारा: github.com/TheLevelUp/ZXingObjC

  • ZBar बार कोड, सी आधारित पढ़ने के लिए एक ओपन सोर्स सॉफ्टवेयर।

मेरे प्रयोगों के मुताबिक, जेडबार कम से कम आईफोन पर ज़ेडएक्सिंग से कहीं अधिक सटीक और तेज़ है।


मेरा मानना ​​है कि यह AVFramework का उपयोग करके किया जा सकता है, यह करने के लिए नमूना कोड है

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
            }
        }
    }
}


यदि आपके एप्लिकेशन के लिए आईपैड 2 या आईपॉड टच के लिए समर्थन महत्वपूर्ण है, तो मैं एक बारकोड स्कैनर एसडीके चुनूंगा जो धुंधली छवियों में बारकोड को डीकोड कर सकता है, जैसे आईओएस और एंड्रॉइड के लिए हमारे स्कैंडिट बारकोड स्कैनर एसडीके । डिकोडिंग धुंधला बारकोड छवियां ऑटोफोकस कैमरे वाले फोन पर भी सहायक होती हैं क्योंकि उपयोगकर्ता को ऑटोफोकस को लात मारने की प्रतीक्षा नहीं करनी पड़ती है।

स्कैंडिट एक मुफ्त सामुदायिक मूल्य योजना के साथ आता है और इसमें एक उत्पाद एपीआई भी है जो बारकोड संख्याओं को उत्पाद नामों में परिवर्तित करना आसान बनाता है।

(अस्वीकरण: मैं स्कैंडिट का सह-संस्थापक हूं)


यहां सरल कोड है:

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
}

हमने आईफोन के लिए 'बारकोड्स' एप्लिकेशन का उत्पादन किया। यह क्यूआर कोड डीकोड कर सकते हैं। स्रोत कोड zxing प्रोजेक्ट से उपलब्ध है; विशेष रूप से, आप आईफोन क्लाइंट और कोर लाइब्रेरी के आंशिक सी ++ पोर्ट पर एक नज़र डालना चाहते हैं। पोर्ट जावा कोड की 0.9 रिलीज से लगभग थोड़ी पुरानी है, लेकिन अभी भी उचित रूप से अच्छी तरह से काम करना चाहिए।

यदि आपको अन्य प्रारूपों को स्कैन करने की आवश्यकता है, जैसे 1 डी प्रारूप, तो आप इस प्रोजेक्ट के भीतर जावा कोड के बंदरगाह को C ++ पर जारी रख सकते हैं।

संपादित करें: परियोजना में बारकोड और आईफोन कोड 2014 की शुरुआत में सेवानिवृत्त हुए थे।



liteqr github पर " liteqr से पोर्ट किया गया उद्देश्य सी में लाइट क्यूआर रीडर" है और liteqr 4 के लिए समर्थन है।


iOS7 के रिलीज के साथ आपको अब बाहरी ढांचे या पुस्तकालय का उपयोग करने की आवश्यकता नहीं है। एवीएफउंडेशन के साथ आईओएस पारिस्थितिक तंत्र अब ईएएन से यूपीसी पर क्यूआर से लगभग हर कोड स्कैनिंग का समर्थन करता है

बस टेक नोट और AVFoundation प्रोग्रामिंग गाइड पर एक नज़र डालें। AVMetadataObjectTypeQRCode आपका मित्र है।

यहां एक अच्छा ट्यूटोरियल है जो इसे चरण-दर-चरण दिखाता है: आईफोन क्यूआर कोड स्कैन लाइब्रेरी आईओएस 7

इसे सेट अप करने के बारे में बस एक छोटा सा उदाहरण:

#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];
}




barcode