目前在Objective-C中,我使用Zbar(http://zbar.sourceforge.net/)生成&讀取QR碼。現在,我只想繼續Swift開發,是否有任何'如何'或圖書館關於生成和讀取QR碼在Swift?Swift中的QR碼讀取器和發生器
回答
從iOS 7開始,iOS設備可以讀取QR碼。但是,沒有內置的生成QR碼的方式。這是一個快速和骯髒的QR碼閱讀器。
首先,import AVFoundation
,並添加AVCaptureMetadataOutputObjectsDelegate
接下來,設置捕捉會話:
func captureQRCode() {
let session = AVCaptureSession()
let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
let input = AVCaptureDeviceInput.deviceInputWithDevice(device, error: nil) as AVCaptureDeviceInput
session.addInput(input)
let output = AVCaptureMetadataOutput()
output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
session.addOutput(output)
output.metadataObjectTypes = [AVMetadataObjectTypeQRCode]
let previewLayer = AVCaptureVideoPreviewLayer(session: session)
let bounds = self.view.layer.bounds
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer.bounds = bounds
previewLayer.position = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds))
self.view.layer.addSublayer(previewLayer)
session.startRunning()
}
最後,辦理委託
func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
for item in metadataObjects {
if let metadataObject = item as? AVMetadataMachineReadableCodeObject {
if metadataObject.type == AVMetadataObjectTypeQRCode {
println("QR Code: \(metadataObject.stringValue)")
}
}
}
}
這裏是我寫的生成QR碼的碼迅速。
//MARK:- generate QR code
func generateQRImage(stringQR:NSString, withSizeRate rate:CGFloat) -> UIImage
{
var filter:CIFilter = CIFilter(name:"CIQRCodeGenerator")
filter.setDefaults()
var data:NSData = stringQR.dataUsingEncoding(NSUTF8StringEncoding)!
filter.setValue(data, forKey: "inputMessage")
var outputImg:CIImage = filter.outputImage
var context:CIContext = CIContext(options: nil)
var cgimg:CGImageRef = context.createCGImage(outputImg, fromRect: outputImg.extent())
var img:UIImage = UIImage(CGImage: cgimg, scale: 1.0, orientation: UIImageOrientation.Up)!
var width = img.size.width * rate
var height = img.size.height * rate
UIGraphicsBeginImageContext(CGSizeMake(width, height))
var cgContxt:CGContextRef = UIGraphicsGetCurrentContext()
CGContextSetInterpolationQuality(cgContxt, kCGInterpolationNone)
img.drawInRect(CGRectMake(0, 0, width, height))
img = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return img
}
這裏是我寫的生成QR碼在Objective-C代碼:
#pragma mark - qrimage
-(UIImage *)generateQRimg:(NSString *)a withsize:(CGFloat)b
{
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
[filter setDefaults];
NSData *data = [a dataUsingEncoding:NSUTF8StringEncoding];
[filter setValue:data forKey:@"inputMessage"];
CIImage *outputImage = [filter outputImage];
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef cgImage = [context createCGImage:outputImage
fromRect:[outputImage extent]];
UIImage *image = [UIImage imageWithCGImage:cgImage
scale:1.
orientation:UIImageOrientationUp];
// Resize without interpolating
UIImage *resized = [self resizeImage:image
withQuality:kCGInterpolationNone
rate:b];
CGImageRelease(cgImage);
return resized;
}
- (UIImage *)resizeImage:(UIImage *)image withQuality (CGInterpolationQuality)quality rate:(CGFloat)rate
{
UIImage *resized = nil;
CGFloat width = image.size.width * rate;
CGFloat height = image.size.height * rate;
UIGraphicsBeginImageContext(CGSizeMake(width, height));
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetInterpolationQuality(context, quality);
[image drawInRect:CGRectMake(0, 0, width, height)];
resized = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resized;
}
請在swift代碼中提供 – tesmojones 2015-04-01 04:34:04
@tesmojones檢查下面的註釋是我寫的用於在swift中生成QR碼的代碼。 – 2015-04-02 07:28:44
一個不太快速和骯髒的快速實施的QR碼閱讀器,考慮到一個事實,即AVCaptureSession
的startRunning()
是一個阻塞調用等細節,可以在這裏找到:
https://bitbucket.org/snippets/stefanpilger/gE98R/qr-code-reader-class-swift
這GitHub的親JECT提供了有關如何生成QR碼的一些代碼:
https://github.com/aschuch/QRCode
// NSData
let data = "http://schuch.me".dataUsingEncoding(NSISOLatin1StringEncoding)
let qrCode = QRCode(data)
qrCode.image
至於閱讀,還有一個很好的GitHub項目位置:
https://github.com/yannickl/QRCodeReader.swift
// Good practice: create the reader lazily to avoid cpu overload during the
// initialization and each time we need to scan a QRCode
lazy var reader = QRCodeReaderViewController(metadataObjectTypes: [AVMetadataObjectTypeQRCode])
@IBAction func scanAction(sender: AnyObject) {
// Retrieve the QRCode content
// By using the delegate pattern
reader.delegate = self
// Or by using the closure pattern
reader.completionBlock = { (result: String?) in
println(result)
}
// Presents the reader as modal form sheet
reader.modalPresentationStyle = .FormSheet
presentViewController(reader, animated: true, completion: nil)
}
// MARK: - QRCodeReader Delegate Methods
func reader(reader: QRCodeReader, didScanResult result: String) {
self.dismissViewControllerAnimated(true, completion: nil)
}
func readerDidCancel(reader: QRCodeReader) {
self.dismissViewControllerAnimated(true, completion: nil)
}
我建議你看看這兩個項目,並結合代碼來實現你想要的行爲。
QR碼發生器在斯威夫特:
在viewDidLoad
:
var qrcodeImage: CIImage!
@IBOutlet var qrtext: UITextField!
@IBOutlet var imgQRCode: UIImageView!
@IBAction func displayQRcode(sender: AnyObject) {
if qrcodeImage == nil {
if qrtext.text == "" {
return
}
let data = qrtext.text!.dataUsingEncoding(NSISOLatin1StringEncoding, allowLossyConversion: false)
let filter = CIFilter(name: "CIQRCodeGenerator")
filter!.setValue(data, forKey: "inputMessage")
filter!.setValue("Q", forKey: "inputCorrectionLevel")
qrcodeImage = filter!.outputImage
qrtext.resignFirstResponder()
displayQRCodeImage()
}
else {
self.imgQRCode.image = nil
self.qrcodeImage = nil
}
}
func displayQRCodeImage() {
let scaleX = imgQRCode.frame.size.width/qrcodeImage.extent.size.width
let scaleY = imgQRCode.frame.size.height/qrcodeImage.extent.size.height
let transformedImage = qrcodeImage.imageByApplyingTransform(CGAffineTransformMakeScale(scaleX, scaleY))
imgQRCode.image = UIImage(CIImage: transformedImage)
}
和QR碼閱讀器
SWIFT 3:QR碼閱讀器
工序首先:只需在信息添加一行。plist和隱私 - CameraUsageDescription添加到新創建的行中,並添加一個字符串,用於通知用戶爲什麼需要在您的應用程序中訪問攝像頭。
STEP第二:在你的ViewController類
class QrCodeScannerViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
var calssName:String = "QrCodeScannerViewController"
var captureSession:AVCaptureSession?
var videoPreviewLayer:AVCaptureVideoPreviewLayer?
var qrCodeFrameView:UIView?
@IBOutlet weak var messageLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
captureQRCode()
}
/* Open camera to capture QR CODE */
func captureQRCode() {
captureSession = AVCaptureSession()
let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
let input = try! AVCaptureDeviceInput(device: device) as AVCaptureDeviceInput
captureSession?.addInput(input)
let output = AVCaptureMetadataOutput()
output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
captureSession?.addOutput(output)
output.metadataObjectTypes = [AVMetadataObjectTypeQRCode]
videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
let bounds = self.view.layer.bounds
videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
videoPreviewLayer?.bounds = bounds
videoPreviewLayer?.position = CGPoint(x:bounds.midX, y:bounds.midY)
self.view.layer.addSublayer(videoPreviewLayer!)
captureSession?.startRunning()
}
/* onAtivityResult from App Delegate */
func captureOutput(_ captureOutput: AVCaptureOutput!,
didOutputMetadataObjects metadataObjects: [Any]!,
from connection: AVCaptureConnection!) {
for item in metadataObjects {
if let metadataObject = item as? AVMetadataMachineReadableCodeObject {
if metadataObject.type == AVMetadataObjectTypeQRCode {
print("QR Code: \(metadataObject.stringValue)")
hideCamera(voucherHashkey: metadataObject.stringValue)
}
}
}
}
/* Hide camera after getting result */
func hideCamera(voucherHashkey:String){
self.captureSession?.stopRunning()
self.videoPreviewLayer?.removeFromSuperlayer()
self.videoPreviewLayer = nil;
self.captureSession = nil;
// sendVocherDataToServer(voucherHashKey: voucherHashkey)
}
}
- 1. 測試QR碼讀取器
- 2. zbar和QR碼閱讀器 - QR碼閱讀器
- 3. 適用於Android的QR碼閱讀器和發生器應用程序
- 4. 的QR碼閱讀器
- 5. QR編碼圖象發生器
- 6. 讀取QR碼
- 7. Flex4.6中的條形碼/ QR閱讀器?
- 8. Javascript QR代碼生成器
- 9. BlackBerry閱讀器中的qr閱讀器
- 10. 在android中的QR碼生成器
- 11. iphone中的QR碼和條碼閱讀器
- 12. 從QR碼中讀取VCFCard?
- 13. 從qr代碼掃描器(Xcode/Swift)
- 14. Android庫可讀取QR碼和EAN碼
- 15. 增加的QR碼讀取
- 16. Zxing的QR碼閱讀器例外
- 17. 適用於Android的Qr碼閱讀器
- 18. 適用於iPhone的QR碼閱讀器
- 19. 用於BlackBerry的QR碼閱讀器
- 20. QR代碼在網頁中的讀取器
- 21. 於讀取條碼QR碼閱讀器的lib只讀取我所看到的只是史蒂夫修補的QR碼閱讀器庫EAN13格式
- 22. 如何限制ZBar QR碼閱讀器只檢測QR碼?
- 23. QR閱讀器android
- 24. 用於Ruby的Datamatrix條形碼讀取器/發生器?
- 25. 帶QR碼的PHP QRCode生成器
- 26. Swift iOS 9 QR掃描器
- 27. 針對Mac的QR碼閱讀器的開發
- 28. 使用ImageMagick/zbar和讀取QR碼
- 29. 斑馬線iPhone QR碼閱讀器
- 30. 如何製作QR碼閱讀器
使用此代碼出了什麼問題只是用zbar和庫從斯威夫特? – 2014-09-24 06:34:01
沒有錯,我只是搜索Swift langunge基地,如果存在 – tesmojones 2014-09-24 08:33:41
請參閱http://stackoverflow.com/questions/20144071/with-zxing-retiring-for-ios-which-barcode-scanner-to-switch-to/ 20144677#20144677 – 2014-11-06 20:39:02