2014-07-06 11 views
9

Jak przekonwertować NSImage na CGImage w Swift? W Objective-C, zrobiłem to tak:Swift NSImage to CGImage

- (CGImageRef)CGImage { 
    NSData *imageData = self.TIFFRepresentation; 
    CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL); 
    CGImageRef maskRef = CGImageSourceCreateImageAtIndex(source, 0, NULL); 
    return maskRef; 
} 

Teraz Próbowałem z:

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; 
    } 
    } 
} 

nie mogę skompilować, otrzymuję błąd: Could not find an overload for 'init' that accepts the supplied arguments' na linii let maskRef ...

Odpowiedz

7

Ah, znalazłem rozwiązanie. Dzieje się tak dlatego, że w Swift znajduje się tylko obiekt niezarządzany (po prostu tak naprawdę nie rozumiem, co to oznacza). Ale teraz ten kod działa:

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(); 
    } 
    } 
} 
+0

prawo. Z książki firmy Apple: 'Gdy Swift importuje interfejsy API, które nie zostały adnotowane, kompilator nie może automatycznie zapamiętywać zarządzania zwróconymi obiektami Core Foundation. Swift otacza zwrócone obiekty Core Foundation w strukturze Unmanaged . Wszystkie pośrednio zwrócone obiekty Core Foundation są również niezarządzane. " Fragment: Apple Inc." Używanie Swift z kakao i Objective-C. "IBooks. https://itunes.apple.com/ru/book/using-swift-cocoa-objective/id888894773?l=en&mt=11 – ovejka

+4

co to jest takeUnretainedValue? nie ma czegoś takiego na szybkie. – SpaceDog

18

Oto co używam do konwersji NSImage do 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) 
} 
+4

Możesz podać 'nil' dla' proposedRect' i uzyskać ten sam wynik. –

0

Swift code 3 i 4 w wersji: -

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