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

有没有办法在iOS上生成二维码图像,ios,qr-code,Ios,Qr Code,是否有标准方法生成二维码并将其附加到iOS客户端应用程序的邮件项目(无服务器代码) …这将让我生成链接 首先,您需要找到一个短链接服务,例如,或,使长链接变短,从而减少二维码大小 要自动执行此任务,您必须使用一些web服务 …然后生成二维码 是一款流行的开源QR代码生成器,也可用于iOS自iOS 7以来,您可以使用核心图像过滤器生成QR图像。见: 使用Swift 2 import UIKit import CoreImage func createQRFromString(str: Strin

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

…这将让我生成链接

首先,您需要找到一个短链接服务,例如,或,使长链接变短,从而减少二维码大小

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

…然后生成二维码


是一款流行的开源QR代码生成器,也可用于iOS

自iOS 7以来,您可以使用核心图像过滤器生成QR图像。见:


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

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

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

如果您不介意使用公共api,这里有一个简单的10秒方法


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

我为Obj-C创建了一个NSString类别,给了迈克·德米多夫一个很棒的答案

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

这个问题提出已经有一段时间了,已经给出了一些几乎完美的答案。然而,我不得不调整并结合几个答案,使其在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
}
@ibvar-qrCodeBox:UIImageView!
func createQRFromString(str:String,size:CGSize)->UIImage{
让stringData=str.data(使用:.utf8)
让qrFilter=CIFilter(名称:“CIQRCodeGenerator”)!
qrFilter.setValue(stringData,forKey:“inputMessage”)
qrFilter.setValue(“H”,forKey:“inputCorrectionLevel”)
让minimalQRimage=qrFilter.outputImage!
//请注意,二维码始终为正方形,因此最小QRimage..width===.height
设minimalSideLength=minimalQRimage.extent.width
让smallestOutputExtent=(size.width
trued,如果你有任何有用的教程,那就太好了……图像模糊。如何修复?请在链接中查找以下函数:CreateNonInterpolatedUIImagefromCiImages根据文档,您应该使用
NSISOLatin1StringEncoding
而不是UTF-8。如果二维码模糊,请尝试此操作。CIImage*image=[self-createQRForString:qrString];CGAffineTransform transform=CGAffineTransformMakeScale(5.0f,5.0f);//沿两个维度缩放5倍CIImage*输出=[image imageByApplyingTransform:transform];我使用kevin的解决方案使图像不模糊,它在真实设备上工作。ZXing是生成QRCode的一个选择,这是一个很好的答案。你确定ZXing库在iOS中可以提供QRCode吗@Avivo是ZXing的一个目标C实现。通过使用桥接头文件,它应该可以与Swift一起使用。您必须将
scaleImage
乘以
UIScreen.main.scale
,否则最终的UIImage将太小。例如,在屏幕比例为3.0的iPhoneX上,如果您尝试制作一个300x300二维码,如果您按原样使用该二维码,最终的UIImage将为100x100。
#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
@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
}