Get Image from CALayer or NSView (swift 3) Get Image from CALayer or NSView (swift 3) swift swift

Get Image from CALayer or NSView (swift 3)


Here are some NSView options:

extension NSView {    /// Get `NSImage` representation of the view.    ///    /// - Returns: `NSImage` of view    func image() -> NSImage {        let imageRepresentation = bitmapImageRepForCachingDisplay(in: bounds)!        cacheDisplay(in: bounds, to: imageRepresentation)        return NSImage(cgImage: imageRepresentation.cgImage!, size: bounds.size)    }}

Or

extension NSView {    /// Get `Data` representation of the view.    ///    /// - Parameters:    ///   - fileType: The format of file. Defaults to PNG.    ///   - properties: A dictionary that contains key-value pairs specifying image properties.    /// - Returns: `Data` for image.    func data(using fileType: NSBitmapImageFileType = .PNG, properties: [String : Any] = [:]) -> Data {        let imageRepresentation = bitmapImageRepForCachingDisplay(in: bounds)!        cacheDisplay(in: bounds, to: imageRepresentation)        return imageRepresentation.representation(using: fileType, properties: properties)!    }}

Some CALayer options:

extension CALayer {    /// Get `NSImage` representation of the layer.    ///    /// - Returns: `NSImage` of the layer.    func image() -> NSImage {        let width = Int(bounds.width * self.contentsScale)        let height = Int(bounds.height * self.contentsScale)        let imageRepresentation = NSBitmapImageRep(bitmapDataPlanes: nil, pixelsWide: width, pixelsHigh: height, bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: false, colorSpaceName: NSDeviceRGBColorSpace, bytesPerRow: 0, bitsPerPixel: 0)!        imageRepresentation.size = bounds.size        let context = NSGraphicsContext(bitmapImageRep: imageRepresentation)!        render(in: context.cgContext)        return NSImage(cgImage: imageRepresentation.cgImage!, size: bounds.size)    }}

Or

extension CALayer {    /// Get `Data` representation of the layer.    ///    /// - Parameters:    ///   - fileType: The format of file. Defaults to PNG.    ///   - properties: A dictionary that contains key-value pairs specifying image properties.    ///    /// - Returns: `Data` for image.    func data(using fileType: NSBitmapImageFileType = .PNG, properties: [String : Any] = [:]) -> Data {        let width = Int(bounds.width * self.contentsScale)        let height = Int(bounds.height * self.contentsScale)        let imageRepresentation = NSBitmapImageRep(bitmapDataPlanes: nil, pixelsWide: width, pixelsHigh: height, bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: false, colorSpaceName: NSDeviceRGBColorSpace, bytesPerRow: 0, bitsPerPixel: 0)!        imageRepresentation.size = bounds.size        let context = NSGraphicsContext(bitmapImageRep: imageRepresentation)!        render(in: context.cgContext)        return imageRepresentation.representation(using: fileType, properties: properties)!    }}