将UIImage转换为(NS)数据产生零?

时间:2018-06-15 09:56:27

标签: ios swift uiimage ciimage

我拼命想在Swift中创建一个qr代码并将图像转换为(NS)数据字符串。它应该在以后作为HTML文件中的图像。 虽然qr代码是完美创建的,但转换为数据字符串仍会产生nil。有没有人知道我的代码有什么问题?

let dataString = "some text or code or whatever"
let data = dataString.data(using: .utf8)

if let filter = CIFilter(name: "CIQRCodeGenerator") {
    filter.setValue(data, forKey: "inputMessage")
    filter.setValue("Q", forKey: "inputCorrectionLevel")
    let transform = CGAffineTransform(scaleX: 3, y: 3)

    if let output = filter.outputImage?.transformed(by: transform) {

        let bild = UIImage(ciImage: output) // <-- works quite well, image is shown in ImageView
        let bildData = UIImageJPEGRepresentation(bild, 1.0)  // <-- produces NIL

        let bildString = bildData?.base64EncodedString(options: .lineLength64Characters)
        //also tried: let bildString: String = String(data: bildData, encoding: .utf8)!
        print("QRCODE-String: \(bildString)")  // NIL
    }
}   

我也尝试UIImagePNGRepresentation()同样的结果。

1 个答案:

答案 0 :(得分:1)

CIImage是过滤器指令。 CGImage是位图数据。

UIImage是一个包装器。包装CIImage的UIImage仅包含过滤器指令。包装CGImage的UIImage包含位图数据。

所以你遇到的问题与NSData无关。它与UIImage有关。你在说:

let bild = UIImage(ciImage: output)
let bildData = UIImageJPEGRepresentation(bild, 1.0) 

bild不是“真实”的形象;它只是CIImage的一种包装。图像中有无数据 - 所有内容都是CIImage过滤器的说明。在将渲染图像转换为位图之前,您无法看到任何内容。 UIImageView可能能够为你做到这一点,但UIImageJPEGRepresentation不能。

如果要将图像保存为数据,首先图像绘制到图像图形上下文中,以获取位图。提取生成的图像,现在您有一个由CGImage支持的真实 UIImage。您现在可以保存其数据,因为现在它具有数据。