ios 有没有一种方法来生成iOS上的QR码图片

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12051118/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-30 19:47:25  来源:igfitidea点击:

Is there a way to generate QR code image on iOS

iosqr-code

提问by user1561181

Is there a standard way to generate a QR code and attach it to a mail item from iOS client app (no server code)?

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

回答by quarac

Since iOS 7, you can use a Core Image filter to generate QR images. See the final tip here:

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

回答by Mike Demidov

For Obj-C version that perfectly works for me, I've mixed answers ??? and Teja Kumar Bethina:

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

回答by ???

Using Swift 2

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

enter image description here

在此处输入图片说明

Swift 3.0

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

Swift 4.2

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

回答by Fred Truter

It has been a while since this question was asked and a number of almost perfect answers have been given already. However I had to tweak and combine several answers to get it working perfectly for AppleTV 4K, iPhone X and iPadPro using Xcode 9.2 in 2018. Here's the code if anyone needs it.

自从提出这个问题以来已经有一段时间了,并且已经给出了一些几乎完美的答案。然而,我不得不调整并结合几个答案,使其在 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
}

回答by Teja Kumar Bethina

Code to generate QR image in Swift 2.0.

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

回答by ingaham

I have used the QR Code Encoderfor QR generation. It is very easy to use. There are some other option to generate, e.g this.

我使用QR Code Encoder生成 QR。这是非常容易使用。还有一些其他选项可以生成,例如this

回答by Avivo

...which will let me generate links...

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

First, you need to find a short link service, e.g. bit.lyor goo.by, to make a long link shorter and thus reduce QR Code size.

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

To perform this task automatically you will have to use some web service.

要自动执行此任务,您必须使用某些 Web 服务。

...then generate a QR code...

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

ZXingis a popular open source QR Code generator also available for iOS

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

回答by Sharukh Mastan

If you don't mind using public api, here is an easy 10 seconds method. http://goqr.me/api

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

Just fill in the data parameter, and load the image from the response. Cheers.

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

回答by gorkem

I created a NSString Category for Obj-C, taking Mike Demidov awesome answer

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

NString+GGQRCode.h

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

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