来自Swift的CGImageRef的NSData

时间:2015-11-20 13:25:59

标签: swift core-graphics nsdata

我很难弄清楚如何从NSData获取图像的CGImageRef表示。我发现的所有答案都使用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!
    }
}

但演员阵容没有成功......

1 个答案:

答案 0 :(得分:4)

CGDataProviderCopyData()会返回可选的CFData?,并且无法转换为非可选NSData。但你可以转换/桥接 它到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之间的免费桥接有关 和基金会类型。