如何在Swift中将NSImage转换为CGImage?在Objective-C中,我这样做:
- (CGImageRef)CGImage {
NSData *imageData = self.TIFFRepresentation;
CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
CGImageRef maskRef = CGImageSourceCreateImageAtIndex(source, 0, NULL);
return maskRef;
}
现在我尝试了:
extension NSImage {
var CGImage: CGImageRef {
get {
let imageData = self.TIFFRepresentation
let source = CGImageSourceCreateWithData(imageData as CFDataRef, nil)
let maskRef = CGImageSourceCreateImageAtIndex(source, UInt(0), nil)
return maskRef;
}
}
}
我无法编译,我收到错误:Could not find an overload for 'init' that accepts the supplied arguments'
行let maskRef ...
这是我用来将NSImage转换为CGImage的方法:
let image = NSImage(named:"image")
if let image = image {
var imageRect:CGRect = CGRectMake(0, 0, image.size.width, image.size.height)
var imageRef = image.CGImageForProposedRect(&imageRect, context: nil, hints: nil)
}
啊,我找到了解决方案。这是因为在Swift中你只有一个非托管对象(我只是不明白,这意味着什么)。但是这个代码现在有效:
extension NSImage {
var CGImage: CGImageRef {
get {
let imageData = self.TIFFRepresentation
let source = CGImageSourceCreateWithData(imageData as CFDataRef, nil).takeUnretainedValue()
let maskRef = CGImageSourceCreateImageAtIndex(source, UInt(0), nil)
return maskRef.takeUnretainedValue();
}
}
}
Swift 3和4版本代码: -
if let image = NSImage(named: "Icon"){
let cgImage = image.cgImage(forProposedRect: nil, context: nil, hints: nil)
}
对于Swift 4.0,XCode 9.2:
extension NSImage {
@objc var CGImage: CGImage? {
get {
guard let imageData = self.tiffRepresentation else { return nil }
guard let sourceData = CGImageSourceCreateWithData(imageData as CFData, nil) else { return nil }
return CGImageSourceCreateImageAtIndex(sourceData, 0, nil)
}
}
}