2014-07-06 22 views
9

Làm cách nào để chuyển đổi NSImage thành CGImage trong Swift? Trong Objective-C tôi đã làm nó như thế này: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; 
} 

Bây giờ tôi thử với:

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

tôi không thể biên dịch, tôi nhận được lỗi: Could not find an overload for 'init' that accepts the supplied arguments' tại dòng let maskRef ...

Trả lời

7

Ah, tôi đã tìm ra giải pháp. Đó là bởi vì trong Swift bạn chỉ là một đối tượng không được quản lý (tôi đã không thực sự hiểu, điều này có nghĩa là gì). Tuy nhiên, mã này hiện đang làm việc:

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

Đúng vậy. Đó là từ cuốn sách của Apple: 'Khi Swift nhập các API chưa được chú thích, trình biên dịch không thể tự động quản lý bộ nhớ đối tượng Core Foundation được trả về. Swift kết thúc tốt đẹp các đối tượng Core Foundation này trong cấu trúc không được quản lý . Tất cả các đối tượng Core Foundation được trả về gián tiếp cũng không được quản lý.' Trích từ: Apple Inc. "Sử dụng Swift với Cocoa và Objective-C." IBooks. https://itunes.apple.com/ru/book/using-swift-cocoa-objective/id888894773?l=vi&mt=11 – ovejka

+4

takeUnretainedValue là gì? không có điều gì trên nhanh chóng. – SpaceDog

18

Đây là những gì tôi đang sử dụng để chuyển đổi 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) 
} 
+4

Bạn có thể chuyển 'nil' cho' proposalRect' và nhận kết quả tương tự. –

0

Swift 3 và 4 phiên bản mã: -

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