Swift 中来自 CGImageRef 的 NSData
NSData from CGImageRef in Swift
我很难弄清楚如何从 CGImageRef
中获取图像的 NSData
表示。我找到的所有答案都使用 UIImage
或 NSImage
,但我的应用程序是跨平台的,所以我只想使用 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 ...
}
这是一个更简单的示例,演示了与
CFString
和 NSString
:
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 之间的免费电话桥接有关
和基础类型。
我很难弄清楚如何从 CGImageRef
中获取图像的 NSData
表示。我找到的所有答案都使用 UIImage
或 NSImage
,但我的应用程序是跨平台的,所以我只想使用 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 ...
}
这是一个更简单的示例,演示了与
CFString
和 NSString
:
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 之间的免费电话桥接有关 和基础类型。