Swift NSImage到CGImage

Lup*_*rus 12 cocoa nsimage swift

如何在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;
}
Run Code Online (Sandbox Code Playgroud)

现在我尝试了:

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;
    }
    }
}
Run Code Online (Sandbox Code Playgroud)

我无法编译,我收到错误:Could not find an overload for 'init' that accepts the supplied arguments'在线let maskRef ...

az_*_*az_ 25

这是我用来将NSImage转换为CGImage的方法:

let image = NSImage(named:"image")
if let image = image {
    var imageRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
    let imageRef = image.cgImage(forProposedRect: &imageRect, context: nil, hints: nil)
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以为`proposedRect`传递`nil`并获得相同的结果. (7认同)

Lup*_*rus 8

啊,我找到了解决方案.这是因为在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();
    }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 什么是takeUnretainedValue?快速没有这样的事情. (5认同)

Jay*_*hta 6

Swift 3和4版本代码: -

if let image = NSImage(named: "Icon"){
    let cgImage = image.cgImage(forProposedRect: nil, context: nil, hints: nil)
}
Run Code Online (Sandbox Code Playgroud)