ios - 将 UIImage 转换为 (NS)Data 会产生 nil?

标签 ios swift uiimage ciimage

<分区>

我拼命地尝试在 Swift 中创建一个二维码并将图像转换为 (NS)Data-String。它应该在稍后充当 HTML 文件中的图像。 尽管二维码创建完美,但转换为数据字符串仍然会生成 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() 得到了同样的结果。

最佳答案

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。您现在可以保存它的数据,因为现在它数据。

关于ios - 将 UIImage 转换为 (NS)Data 会产生 nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50873203/

相关文章:

iphone - UIView 始终以纵向模式加载

swift - 自定义表格 View

ios - 从 NSData 创建 Jpeg

ios - 无法使用 SDWebImage 框架获取对图像的引用

ios - 使用 iOS 从 bundle 中加载图像

objective-c - 在 NSPredicate 中访问数字 NSDictionary 键

c# - 使用 "POST"方法从 .net 服务器(C# 和 json 格式)获取响应到 Objective-c 问题

ios - 如何在运行时访问类的源代码级定义?

ios - 为什么 swift 隐藏受限协议(protocol)的默认实现?

Swift 获取自定义注解信息