有没有办法在iOS上生成QR码图像

use*_*181 32 qr-code ios

是否有标准的方法来生成QR码并将其附加到iOS客户端应用程序的邮件项目(没有服务器代码)?

qua*_*rac 87

从iOS 7开始,您可以使用Core Image过滤器生成QR图像.请在此处查看最终提示:

- (CIImage *)createQRForString:(NSString *)qrString {
    NSData *stringData = [qrString dataUsingEncoding: NSISOLatin1StringEncoding];

    CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    [qrFilter setValue:stringData forKey:@"inputMessage"];

    return qrFilter.outputImage;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果qr代码模糊,试试这个.CIImage*image = [self createQRForString:qrString]; CGAffineTransform transform = CGAffineTransformMakeScale(5.0f,5.0f); //沿着两个维度缩放5次CIImage*output = [image imageByApplyingTransform:transform]; (23认同)
  • 图像模糊.我该如何解决? (2认同)
  • 我使用凯文(Kevin)的解决方案使图像不模糊,它可以在真实设备上使用。 (2认同)

Mik*_*dov 20

对于完全适合我的Obj-C版本,我混合了答案和Teja Kumar Bethina:

NSString *qrString = @"My string to encode";
NSData *stringData = [qrString dataUsingEncoding: NSUTF8StringEncoding];

CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
[qrFilter setValue:stringData forKey:@"inputMessage"];
[qrFilter setValue:@"H" forKey:@"inputCorrectionLevel"];

CIImage *qrImage = qrFilter.outputImage;
float scaleX = self.qrImageView.frame.size.width / qrImage.extent.size.width;
float scaleY = self.qrImageView.frame.size.height / qrImage.extent.size.height;

qrImage = [qrImage imageByApplyingTransform:CGAffineTransformMakeScale(scaleX, scaleY)];

self.qrImageView.image = [UIImage imageWithCIImage:qrImage
                                             scale:[UIScreen mainScreen].scale
                                       orientation:UIImageOrientationUp];
Run Code Online (Sandbox Code Playgroud)


पवन*_*पवन 15

使用Swift 2

import UIKit
import CoreImage

func createQRFromString(str: String) -> CIImage? {
    let stringData = str.dataUsingEncoding(NSUTF8StringEncoding)

    let filter = CIFilter(name: "CIQRCodeGenerator")

    filter?.setValue(stringData, forKey: "inputMessage")

    filter?.setValue("H", forKey: "inputCorrectionLevel")

    return filter?.outputImage
}

if let img = createQRFromString("Hello world program created by someone") {
    let somImage = UIImage(CIImage: img, scale: 1.0, orientation: UIImageOrientation.Down)
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Swift 3.0

import UIKit
import CoreImage

func createQRFromString(_ str: String) -> CIImage? {
        let stringData = str.data(using: String.Encoding.utf8)

        let filter = CIFilter(name: "CIQRCodeGenerator")

        filter?.setValue(stringData, forKey: "inputMessage")

        filter?.setValue("H", forKey: "inputCorrectionLevel")

        if let img = createQRFromString("Hello world program created by someone") {
            let somImage = UIImage(ciImage: img, scale: 1.0, orientation: UIImageOrientation.down)
        }

        return filter?.outputImage
    }

if let img = createQRFromString("Hello world program created by someone") {
            let somImage = UIImage(ciImage: img, scale: 1.0, orientation: UIImageOrientation.down)
        }
Run Code Online (Sandbox Code Playgroud)

Swift 4.2

private func createQRFromString(str: String) -> CIImage? {
        let stringData = str.data(using: .utf8)

        let filter = CIFilter(name: "CIQRCodeGenerator")
        filter?.setValue(stringData, forKey: "inputMessage")
        filter?.setValue("H", forKey: "inputCorrectionLevel")

        return filter?.outputImage
    }

    var qrCode: UIImage? {
        if let img = createQRFromString(str: "Hello world program created by someone") {
            let someImage = UIImage(
                ciImage: img,
                scale: 1.0,
                orientation: UIImage.Orientation.down
            )
            return someImage
        }

        return nil
    }
Run Code Online (Sandbox Code Playgroud)


Fre*_*ter 11

自问这个问题以来已经有一段时间了,已经给出了一些近乎完美的答案.然而,我不得不调整并结合几个答案,以便在2018年使用Xcode 9.2完美地为AppleTV 4K,iPhone X和iPadPro工作.如果有人需要,这是代码.

@IBOutlet weak var qrCodeBox: UIImageView!

func createQRFromString(_ str: String, size: CGSize) -> UIImage {
    let stringData = str.data(using: .utf8)

  let qrFilter = CIFilter(name: "CIQRCodeGenerator")!
  qrFilter.setValue(stringData, forKey: "inputMessage")
  qrFilter.setValue("H", forKey: "inputCorrectionLevel")

  let minimalQRimage = qrFilter.outputImage!
  // NOTE that a QR code is always square, so minimalQRimage..width === .height
  let minimalSideLength = minimalQRimage.extent.width

  let smallestOutputExtent = (size.width < size.height) ? size.width : size.height
  let scaleFactor = smallestOutputExtent / minimalSideLength
  let scaledImage = minimalQRimage.transformed(
    by: CGAffineTransform(scaleX: scaleFactor, y: scaleFactor))

  return UIImage(ciImage: scaledImage, 
                 scale: UIScreen.main.scale, 
                 orientation: .up)
}

override func viewDidLoad() {
    super.viewDidLoad()
    let myQRimage = createQRFromString("https://www.apple.com", 
                      size: qrCodeBox.frame.size)
    qrCodeBox.image = myQRimage
}
Run Code Online (Sandbox Code Playgroud)