【问题标题】:Is there a way to generate QR code image on iOS有没有办法在iOS上生成二维码图像
【发布时间】:2021-04-08 21:37:35
【问题描述】:

是否有一种标准方法可以生成二维码并将其附加到来自 iOS 客户端应用程序的邮件项目(无服务器代码)?

【问题讨论】:

  • 试过了,如果你有任何有用的教程会很棒...

标签: ios qr-code


【解决方案1】:

从 iOS 7 开始,您可以使用 Core Image 过滤器来生成 QR 图像。见the final tip here

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

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

    return qrFilter.outputImage;
}

【讨论】:

  • 图像模糊。我该如何解决?
  • 查看函数链接:createNonInterpolatedUIImageFromCIImage
  • 根据文档,您应该使用 NSISOLatin1StringEncoding 而不是 UTF-8。
  • 如果二维码模糊,试试这个。 CIImage *image = [self createQRForString:qrString]; CGAffineTransform 变换 = CGAffineTransformMakeScale(5.0f, 5.0f); // 沿两个维度缩放 5 倍 CIImage *output = [image imageByApplyingTransform: transform];
  • 我使用kevin的解决方案使图像不模糊,它适用于真实设备。
【解决方案2】:

对于完美适合我的 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];

【讨论】:

    【解决方案3】:

    使用 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)
    }
    

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

    斯威夫特 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
        }
    

    Xcode 12.4 或 Swift 版本 >= 5.2

    import UIKit
    import CoreImage
    
    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
    }
    
    if let img = createQRFromString(str: "Hello world program created by someone") {
      let somImage = UIImage(ciImage: img, scale: 1.0, orientation: .down)
    }
    

    【讨论】:

      【解决方案4】:

      自从提出这个问题以来已经有一段时间了,并且已经给出了一些几乎完美的答案。但是,我必须调整并结合几个答案,才能让它在 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
      }
      

      【讨论】:

      • 这里实际上有一个小错误。您必须将scaledImage 乘以UIScreen.main.scale,否则最终的 UIImage 将太小。例如,在屏幕比例为 3.0 的 iPhone X 上,如果您尝试制作 300x300 的 QR 码,如果您按原样使用此代码,最终的 UIImage 将为 100x100。
      【解决方案5】:

      在 Swift 2.0 中生成 QR 图像的代码。

      let reqStr = “string to convert as QR code”
      let data = reqStr.dataUsingEncoding(NSISOLatin1StringEncoding, allowLossyConversion: false)
      
      let filter = CIFilter(name: "CIQRCodeGenerator")
      filter!.setValue(data, forKey: "inputMessage")
      
      let qrImage:CIImage = filter!.outputImage!
      
      //qrImageView is a IBOutlet of UIImageView        
      let scaleX = qrImageView.frame.size.width / qrImage.extent.size.width
      let scaleY = qrImageView.frame.size.height / qrImage.extent.size.height
      
      let resultQrImage = qrImage.imageByApplyingTransform(CGAffineTransformMakeScale(scaleX, scaleY))
      qrImageView.image = UIImage(CIImage: resultQrImage)
      

      【讨论】:

        【解决方案6】:

        ...这将让我生成链接...

        首先,您需要找到一个短链接服务,例如bit.lygoo.by,使长链接更短,从而减少二维码大小。

        要自动执行此任务,您必须使用一些网络服务。

        ...然后生成二维码...

        ZXing 是一个流行的开源二维码生成器,也可用于 iOS

        【讨论】:

        • ZXing 是生成 QRCode 的选择,这是一个很好的答案。
        • 您确定ZXing 库可用于iOS 中的二维码吗? @Avivo
        • ZXingObjC 是 ZXing 的 Objective C 实现。通过使用桥接头文件,它应该可以与 Swift 一起使用。
        【解决方案7】:

        如果您不介意使用公共 api,这里有一个简单的 10 秒方法。 http://goqr.me/api

        只需填写数据参数,然后从响应中加载图像。干杯。

        【讨论】:

          【解决方案8】:

          我为 Obj-C 创建了一个 NSString 类别,得到了 Mike Demidov 很棒的答案

          NString+GGQRCode.h

          #import <Foundation/Foundation.h>
          #import <UIKit/UIKit.h>
          
          @interface NSString (GGQRCode)
          
          -(UIImage *)qrCodeImage:(CGFloat)width height:(CGFloat)height;
          -(UIImage *)qrCodeImage:(CGFloat)width height:(CGFloat)height scale:(CGFloat)scale orientation:(UIImageOrientation)orientation;
          
          @end
          

          NString+GGQRCode.m

          #import "NSString+GGQRCode.h"
          
          @implementation NSString (GGQRCode)
          
          -(UIImage *)qrCodeImage:(CGFloat)width height:(CGFloat)height
          {
              return [self qrCodeImage:width height:height scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp];
          }
          
          -(UIImage *)qrCodeImage:(CGFloat)width height:(CGFloat)height scale:(CGFloat)scale orientation:(UIImageOrientation)orientation
          {
              NSData *stringData = [self dataUsingEncoding: NSUTF8StringEncoding];
          
              CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
              [qrFilter setValue:stringData forKey:@"inputMessage"];
              [qrFilter setValue:@"H" forKey:@"inputCorrectionLevel"];
          
              CIImage *qrImage = qrFilter.outputImage;
              float scaleX = width / qrImage.extent.size.width;
              float scaleY = height / qrImage.extent.size.height;
          
              qrImage = [qrImage imageByApplyingTransform:CGAffineTransformMakeScale(scaleX, scaleY)];
          
              return [UIImage imageWithCIImage:qrImage scale:scale orientation:orientation];
          }
          
          @end
          

          【讨论】:

            猜你喜欢
            • 2021-11-18
            • 2021-02-28
            • 2010-11-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多