web-dev-qa-db-ja.com

Swiftで文字列からバーコードを生成するにはどうすればよいですか?

私は新しいiOS開発者です。 Swiftでバーコードを生成するにはどうすればいいのかと思っていました。

私はすでにコードを持っています、バーコードを読む方法を学ぶための場所から複数のリソースがありますが、文字列からコードを生成することについて話すものは見つかりませんでした。

どうもありがとう!

追伸これについても同様の質問があることは知っていますが、Objective-Cのものです。私はObj-Cを知らず、.NETから来るのは難しいと感じています。

32
Andrei Dobrin

CoreImage(import CoreImage)それを行うためのフィルター!

    class Barcode {
        class func fromString(string : String) -> UIImage? {
             let data = string.data(using: .ascii)
             if let filter = CIFilter(name: "CICode128BarcodeGenerator") {
                  filter.setValue(data, forKey: "inputMessage")
                  if let outputCIImage = filter.outputImage {
                       return UIImage(ciImage: outputCIImage)
                  }
             }
             return nil
        }
    }

    let img = Barcode.fromString("whateva")

guardおよび失敗可能な初期化子を含む新しいバージョン:

extension UIImage {

    convenience init?(barcode: String) {
        let data = barcode.data(using: .ascii)
        guard let filter = CIFilter(name: "CICode128BarcodeGenerator") else {
            return nil
        }
        filter.setValue(data, forKey: "inputMessage")
        guard let ciImage = filter.outputImage else {
            return nil
        }
        self.init(ciImage: ciImage)
    }

}

使用法:

let barcode = UIImage(barcode: "some text") // yields UIImage?

docs によると:

ISO/IEC 15417:2007標準に従って、入力データを表す出力画像を生成します。出力画像のバーコードの各モジュール(垂直線)の幅は1ピクセルです。バーコードの高さは32ピクセルです。文字列またはURLからバーコードを作成するには、NSASCIIStringEncoding文字列エンコーディングを使用してNSDataオブジェクトに変換します。

75
Matteo Pacini

改善されたコード:

  • バーコードスケーリング
  • バーコード画像の余白を設定する
  • UIImageをNSDataに変換します(何らかの理由で上記のコードでは不可能でした)。
  • バーコード画像を共有するときに失敗しない(おそらく同じバグのため)

Swift

func generateBarcode(from string: String) -> UIImage? {

    let data = string.data(using: String.Encoding.ascii)

    if let filter = CIFilter(name: "CICode128BarcodeGenerator") {
        filter.setDefaults()
        //Margin
        filter.setValue(7.00, forKey: "inputQuietSpace")
        filter.setValue(data, forKey: "inputMessage")
        //Scaling
        let transform = CGAffineTransform(scaleX: 3, y: 3)

        if let output = filter.outputImage?.applying(transform) {
            let context:CIContext = CIContext.init(options: nil)
            let cgImage:CGImage = context.createCGImage(output, from: output.extent)!
            let rawImage:UIImage = UIImage.init(cgImage: cgImage)

            //Refinement code to allow conversion to NSData or share UIImage. Code here:
            //http://stackoverflow.com/questions/2240395/uiimage-created-from-cgimageref-fails-with-uiimagepngrepresentation
            let cgimage: CGImage = (rawImage.cgImage)!
            let cropZone = CGRect(x: 0, y: 0, width: Int(rawImage.size.width), height: Int(rawImage.size.height))
            let cWidth: size_t  = size_t(cropZone.size.width)
            let cHeight: size_t  = size_t(cropZone.size.height)
            let bitsPerComponent: size_t = cgimage.bitsPerComponent
            //THE OPERATIONS ORDER COULD BE FLIPPED, ALTHOUGH, IT DOESN'T AFFECT THE RESULT
            let bytesPerRow = (cgimage.bytesPerRow) / (cgimage.width  * cWidth)

            let context2: CGContext = CGContext(data: nil, width: cWidth, height: cHeight, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: CGColorSpaceCreateDeviceRGB(), bitmapInfo: cgimage.bitmapInfo.rawValue)!

            context2.draw(cgimage, in: cropZone)

            let result: CGImage  = context2.makeImage()!
            let finalImage = UIImage(cgImage: result)

            return finalImage

        }
    }

    return nil
}
15
castillejoale

展開ターゲットが少なくともiOS 8である場合、Core Imageを使用できます。これが私のBarcodeGeneratorクラスです(import CoreImage):

class BarcodeGenerator {
    enum Descriptor: String {
        case code128 = "CICode128BarcodeGenerator"
        case pdf417 = "CIPDF417BarcodeGenerator"
        case aztec = "CIAztecCodeGenerator"
        case qr = "CIQRCodeGenerator"
    }

    class func generate(from string: String, 
                         descriptor: Descriptor, 
                               size: CGSize) -> CIImage? {
        let filterName = descriptor.rawValue

        guard let data = string.data(using: .ascii),
            let filter = CIFilter(name: filterName) else {
                return nil
        }

        filter.setValue(data, forKey: "inputMessage")

        guard let image = filter.outputImage else {
            return nil
        }

        let imageSize = image.extent.size

        let transform = CGAffineTransform(scaleX: size.width / imageSize.width,
                                               y: size.height / imageSize.height)
        let scaledImage = image.transformed(by: transform)

        return scaledImage
    }
}

このように使用できます

BarcodeGenerator.generate(from: "barcode-string", 
                     symbology: .code128, 
                          size: CGSize(width: 800, height: 300))
9
Luca Torella