我拼命想在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()
同样的结果。
答案 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。您现在可以保存其数据,因为现在它具有数据。