【问题标题】:How to generate a QR image in iOS app using swift [closed]如何使用 swift 在 iOS 应用程序中生成 QR 图像 [关闭]
【发布时间】:2022-03-11 14:21:17
【问题描述】:

您好,我正在开发一个 iOS 项目,我想生成一个自定义的二维码,但不知道该怎么做。我也附上一个样本。

我想用 Swift 语言生成这样的二维码。 谢谢

【问题讨论】:

  • 您可以在下面我的回答中使用 CIFilter、CGAffineTransform、代码 sn-p 来实现相同的目的。如果回答了您的问题,请标记为已回答
  • 也许你可以看这里:stackoverflow.com/q/28801350/5575752

标签: ios swift qr-code


【解决方案1】:

这里是生成带有标志图像的二维码的代码:

import UIKit
import EventKit
import CoreImage

class ViewController: UIViewController {

@IBOutlet weak var imageView: UIImageView!

  override func viewDidLoad() {
    super.viewDidLoad()

    guard let qrURLImage = URL(string: "http://pramodkumar.tk")?.qrImage(using: #colorLiteral(red: 0.3490196078, green: 0.768627451, blue: 0.6823529412, alpha: 1), logo: #imageLiteral(resourceName: "logo")) else { return }

    imageView.image = qrURLImage

   }
}


extension URL {

   /// Creates a QR code for the current URL in the given color.
   func qrImage(using color: UIColor, logo: UIImage? = nil) -> UIImage? {

      guard let tintedQRImage = qrImage?.tinted(using: color) else {
         return nil
      }

      guard let logo = logo?.cgImage else {
         return UIImage(ciImage: tintedQRImage)
      }

      guard let final = tintedQRImage.combined(with: CIImage(cgImage: logo)) else {
        return UIImage(ciImage: tintedQRImage)
      }

    return UIImage(ciImage: final)
  }

  /// Returns a black and white QR code for this URL.
  var qrImage: CIImage? {
    guard let qrFilter = CIFilter(name: "CIQRCodeGenerator") else { return nil }
    let qrData = absoluteString.data(using: String.Encoding.ascii)
    qrFilter.setValue(qrData, forKey: "inputMessage")

    let qrTransform = CGAffineTransform(scaleX: 12, y: 12)
    return qrFilter.outputImage?.transformed(by: qrTransform)
  }
}

extension CIImage {
  /// Inverts the colors and creates a transparent image by converting the mask to alpha.
  /// Input image should be black and white.
  var transparent: CIImage? {
     return inverted?.blackTransparent
  }

  /// Inverts the colors.
  var inverted: CIImage? {
      guard let invertedColorFilter = CIFilter(name: "CIColorInvert") else { return nil }

    invertedColorFilter.setValue(self, forKey: "inputImage")
    return invertedColorFilter.outputImage
  }

  /// Converts all black to transparent.
  var blackTransparent: CIImage? {
      guard let blackTransparentFilter = CIFilter(name: "CIMaskToAlpha") else { return nil }
    blackTransparentFilter.setValue(self, forKey: "inputImage")
    return blackTransparentFilter.outputImage
  }

  /// Applies the given color as a tint color.
  func tinted(using color: UIColor) -> CIImage? {
     guard
        let transparentQRImage = transparent,
        let filter = CIFilter(name: "CIMultiplyCompositing"),
        let colorFilter = CIFilter(name: "CIConstantColorGenerator") else { return nil }

    let ciColor = CIColor(color: color)
    colorFilter.setValue(ciColor, forKey: kCIInputColorKey)
    let colorImage = colorFilter.outputImage

    filter.setValue(colorImage, forKey: kCIInputImageKey)
    filter.setValue(transparentQRImage, forKey: kCIInputBackgroundImageKey)

    return filter.outputImage!
  }
}

extension CIImage {

  /// Combines the current image with the given image centered.
  func combined(with image: CIImage) -> CIImage? {
    guard let combinedFilter = CIFilter(name: "CISourceOverCompositing") else { return nil }
    let centerTransform = CGAffineTransform(translationX: extent.midX - (image.extent.size.width / 2), y: extent.midY - (image.extent.size.height / 2))
    combinedFilter.setValue(image.transformed(by: centerTransform), forKey: "inputImage")
    combinedFilter.setValue(self, forKey: "inputBackgroundImage")
    return combinedFilter.outputImage!
  }
}

Github 回购: https://github.com/bestiosdeveloper/QACodeDemo

【讨论】:

  • 对于现场演示项目,您可以找到:github.com/bestiosdeveloper/QACodeDemo
  • 首先感谢您的回答。我想问的最后一件事是如何在示例图像中显示这些点。
  • 感谢@bestiosdeveloper,您节省了我的时间。
【解决方案2】:
func generateQRCode(from string: String) -> UIImage? {
                    let data = string.data(using: .ascii, allowLossyConversion: false)
                    let filter = CIFilter(name: "CIQRCodeGenerator")
                    filter?.setValue(data, forKey: "inputMessage")
                    let img = UIImage(cgImage: CIContext(options: nil).createCGImage((filter?.outputImage!)!, from: (filter?.outputImage!.extent)!)!)
                    return img
                }

【讨论】:

    【解决方案3】:

    您可以使用 CIFilter、CGAffineTransform 实现相同的效果 https://developer.apple.com/documentation/coreimage/cifilter https://developer.apple.com/documentation/coregraphics/cgaffinetransform

    示例代码

    func genQRCode(from input: String) -> UIImage? {
    
        let data = input.data(using: String.Encoding.ascii)
    
        if let filter = CIFilter(name: "CIQRCodeGenerator") {
            filter.setValue(data, forKey: "inputMessage")
            let transform = CGAffineTransform(scaleX: 3, y: 3)
    
            if let output = filter.outputImage?.transformed(by: transform) {
                return UIImage(ciImage: output)
            }
        }
    
        return nil 
    }
    

    let image = generateQRCode(from: "Sample code to generate QR")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      相关资源
      最近更新 更多