Swift 中来自 CGImageRef 的 NSData

NSData from CGImageRef in Swift

我很难弄清楚如何从 CGImageRef 中获取图像的 NSData 表示。我找到的所有答案都使用 UIImageNSImage,但我的应用程序是跨平台的,所以我只想使用 Core Graphics。 Objective-C 回答简单地说明 CFData 是免费桥接到 NSData 并简单地转换它,但是 Swift 不允许这样做。我得到的最接近的是:

var image: CGImageRef? = nil

//...
if let dataProvider: CGDataProviderRef = CGDataProviderCreateWithURL(url) {
    image = CGImageCreateWithPNGDataProvider(dataProvider, nil, false, CGColorRenderingIntent.RenderingIntentDefault) 
    // works fine
    //...
    if let data = CGDataProviderCopyData(CGImageGetDataProvider(image)) as? NSData {
        // Do something with data, if only it ever got here!
    }
}

但演员表从未成功...

CGDataProviderCopyData() returns 可选的 CFData?,并且不能转换为非可选的 NSData。但是你可以 convert/bridge 它到 NSData? 并在可选绑定中使用它:

if let data = CGDataProviderCopyData(CGImageGetDataProvider(image)) as NSData? {
    // Do something with data ...

}

这是一个更简单的示例,演示了与 CFStringNSString:

let cfstr : CFString? = "Hello world"
if let nsstr = cfstr as? NSString {
    print("foo") // not printed
}
if let nsstr = cfstr as NSString? {
    print("bar") // printed
}

但我承认我的解释并不完全令人满意,因为 类似的可选转换在其他情况下也有效:

class MyClass { }
class MySubclass : MyClass { }

let mc : MyClass? = MySubclass()
if let msc = mc as? MySubclass {
    print("yes") // printed
}

所以这一定与 CoreFoundation 之间的免费电话桥接有关 和基础类型。