Project finally do not need to support iOS6 (tear), in the QR code scanning this piece, can completely abandon the ZXing
library, to the system AVFoundation
, took a swift
demo, the effect is as follows:
GitHub Address: point here
Related AVFoundation
and Core Image
(filters, etc.), you can first look at the Objc.io of the 21st and 23rd phases of the introduction.
Initializing video Capture
Initialize video capture private func initcapture () {//Represents abstract hardware device, here incoming video let Capturedevice = Avcapturedevice. Defaultdevicewithmediatype(Avmediatypevideo) var error:nserror? Input stream var captureinput = Avcapturedeviceinput. Deviceinputwithdevice(Capturedevice, Error: &error) as? Avcapturedeviceinput if (Error! = Nil && Captureinput = = nil) {Let Erroralert = Uialertcontroll ER (title:"Reminders", Message:"Please allow XXX to access your camera in the iphone's \" Settings-privacy-camera \ "option, Preferredstyle:. Alert) Erroralert. Addaction(Uialertaction (title:"OK", Style:uialertactionstyle. Default, Handler:nil)) self. Presentviewcontroller(Erroralert, Animated:true, Completion:nil)} else {//input and output bridge, which coordinates the data transfer from Intput to output. ( See word meaning, session-session) Capturesession = Avcapturesession () capturesession!. Addinput(captureinput)//output stream Let Capturemetadataoutput = Avcapturemetadataoutput ()//Limit scan area http ://blog. Csdn. NET/lc_obj/article/details/41549469Capturemetadataoutput. Rectofinterest= CGRectMake (128.0/screenwh. ScreenHeight, (SCREENWH. ScreenWidth-280.0)/SCREENWH. ScreenWidth*2.0,280.0/screenwh. ScreenHeight,280.0/screenwh. ScreenWidth) capturesession!. Addoutput(capturemetadataoutput)//Added queue must be serial capturemetadataoutput as required. Setmetadataobjectsdelegate(Self, Queue:dispatch_get_main_queue ())//Specify the type of information, QRCode, you know Capturemetadataoutput. Metadataobjecttypes= [Avmetadataobjecttypeqrcode]//Use this preview layer and image information capture session (session) to display the video Videopreviewlayer = Avcapturevideop Reviewlayer (session:capturesession!) videopreviewlayer!. Videogravity= Avlayervideogravityresizeaspectfill videopreviewlayer!. Frame= view. BoundsView. Layer. Addsublayer(videopreviewlayer!) } }
Ps:lz with the next and Sina Weibo sweep, found that the scan box is a bluff, that is, you did not take it to the two-dimensional code, as long as the QR code into the mobile phone camera range, you can decode the success ....
So LZ in the code to do a scan area limit (feel pretty boring)
Implementing Agent Decoding
// MARK:-Avcapturemetadataoutputobjectsdelegate func Captureoutput (Captureoutput: avcaptureoutput!, Didoutputmetadataobjectsmetadataobjects: [Anyobject]!, FromconnectionConnection: avcaptureconnection!) {ifMetadataobjects = = Nil | | Metadataobjects.count = =0{captureview!. frame = Cgrectzeroreturn}//Brushed out the data forMetadataObjectinchmetadataobjects {ifMetadataobject.type = = Avmetadataobjecttypeqrcode { Letmetadata = MetadataObject as! Avmetadatamachinereadablecodeobject//Metadata objects are converted to the coordinates of the layer LetCodecoord = videopreviewlayer!. Transformedmetadataobjectformetadataobject (metadata) as! Avmetadatamachinereadablecodeobject captureview!. frame = Codecoord.boundsifMetadata.stringvalue! = Nil {println ("\ (metadata.stringvalue)") self.capturesession!. Stoprunning () LetSuccessalert = Uialertcontroller (title:"Hint",message:"Open"+ Metadata.stringvalue,Preferredstyle: . Alert) successalert.addaction(uialertaction (title:"Cancel", Style:.) Default, Handler: {(_), Void in Self.stopcapture ()})) Successalert.Addaction(uialertaction (title:"OK", style:.) Default, Handler: {(_), Void inif metadata.stringValue.lowercaseString.hasPrefix ("http" ) {uiapplication.sharedapplication (). OpenURL (Nsurl (string:metadata.stringValue)!) self.navigationcontroller!. Popviewcontrolleranimated (true)})) Self.Presentviewcontroller(Successalert, animated: true, Completion:nil)} } } }
The data conversion corresponds to the AVMetadataMachineReadableCodeObject
two-dimensional code.
Generate two-dimensional code
MARK:-Private Methods private func createqrforstring (qrstring:string, qrimagename:string?), UIImage? {if let sureqrstring = qrstring {Let StringData = sureqrstring. datausingencoding(nsutf8stringencoding, Allowlossyconversion:false)//Create a two-dimensional code filter Let Qrfilter = Cifilter (name:"Ciqrcodegenerator") Qrfilter. SetValue(StringData, Forkey:"InputMessage") Qrfilter. SetValue("H", Forkey:"Inputcorrectionlevel") Let Qrciimage = Qrfilter. OutputimageCreate a color filter, black and white let Colorfilter = Cifilter (name:"Cifalsecolor") Colorfilter. SetDefaults() Colorfilter. SetValue(Qrciimage, Forkey:"Inputimage") Colorfilter. SetValue(Cicolor (Red:0, Green:0, Blue:0), Forkey:"InputColor0") Colorfilter. SetValue(Cicolor (Red:1, Green:1, Blue:1), Forkey:"InputColor1")//Return two-dimensional code image let Codeimage = UIImage (ciimage:colorfilter. Outputimage. Imagebyapplyingtransform(Cgaffinetransformmakescale (5,5))//Usually, the QR code is customized, and the middle will put the image to express the meaning if let iconimage = UIImage (named:qrimagename!) {Let rect = CGRectMake (0,0, codeimage!. Size. Width, codeimage!. Size. Height) Uigraphicsbeginimagecontext (rect. Size) codeimage!. Drawinrect(rect) Let avatarsize = Cgsizemake (rect. Size. Width*0.25, rect. Size. Height*0.25) Letx= (rect. Width-Avatarsize. Width) *0.5Lety= (rect. Height-Avatarsize. Height) *0.5Iconimage. Drawinrect(CGRectMake (x,y, avatarsize. Width, avatarsize. Height)) Let Resultimage = Uigraphicsgetimagefromcurrentimagecontext () uigraphicsendimagecontext () Return resultimage} return codeimage} return nil}
End: AVFoundation
This frame is particularly powerful and can also be used to write custom cameras, take photos and record videos, etc.
Swift avfoundation QR code scanning and generation