Получить изображение из CALayer или NSView (Swift 3)
Я искал способ визуализации CALayer или NSView и возврата NSImage.
У меня есть собственный класс, который является подклассом NSView. В начале я просто делаю градиентный слой, чтобы покрыть все NSView.
class ContentView: NSView {
override func draw(_ dirtyRect: NSRect) {
fillGradientLayer()
}
func fillGradientLayer() {
gradientLayer = CAGradientLayer()
gradientLayer.colors = [#colorLiteral(red: 0, green: 0.9909763549, blue: 0.7570167824, alpha: 1),#colorLiteral(red: 0, green: 0.4772562545, blue: 1, alpha: 1)].map({return $0.cgColor})
gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1, y: 0.5)
gradientLayer.frame = self.frame.insetBy(dx: margin, dy: margin)
gradientLayer.zPosition = 2
gradientLayer.name = "gradientLayer"
gradientLayer.contentsScale = (NSScreen.main()?.backingScaleFactor)!
self.layer?.addSublayer(gradientLayer)
}
}
В какой-то момент я хочу получить NSImage (или CGImage) изCALayers. В некоторых темах я нашел следующий подход и превратил его в это:
extension CALayer {
func getBitmapImage() -> NSImage {
let btmpImgRep = NSBitmapImageRep(bitmapDataPlanes: nil, pixelsWide: Int(self.frame.width), pixelsHigh: Int(self.frame.height), bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: false, colorSpaceName: NSDeviceRGBColorSpace, bytesPerRow: 0, bitsPerPixel: 0)
let image: NSImage = NSImage(size: self.frame.size)
image.lockFocus()
let ctx = NSGraphicsContext(bitmapImageRep: btmpImgRep!)
let cgCtxt = ctx!.cgContext
self.render(in: cgCtxt)
cgCtxt.draw(layer: CGLayer, in: CGRect)
image.unlockFocus()
return image
}
}
Первая проблема заключается в том, чторисовать (слой: CGLayer, в: CGRect) Метод хочет CGLayer, но не CALayer.
Во-вторых, я не знаю, будет ли код, с которым я работал, в конечном итоге отобразить мой слой, или я делаю что-то не так.
Спасибо за любую помощь.
Отредактировано: Решение получить CGImage от CALayer.
extension CALayer {
func getBitmapImage() -> NSImage {
let btmpImgRep =
NSBitmapImageRep(bitmapDataPlanes: nil, pixelsWide: Int(self.frame.width), pixelsHigh: Int(self.frame.height), bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: false, colorSpaceName: NSDeviceRGBColorSpace, bytesPerRow: 0, bitsPerPixel: 32)
let ctx = NSGraphicsContext(bitmapImageRep: btmpImgRep!)
let cgContext = ctx!.cgContext
self.render(in: cgContext)
let cgImage = cgContext.makeImage()
let nsimage = NSImage(cgImage: cgImage!, size: CGSize(width: self.frame.width, height: self.frame.height))
return nsimage
}
}
Как получить NSImage от NSView находится в ответе ниже.
Постскриптум Я не знаю о свойствах NSBitmapImageRep, поэтому эта часть может быть неправильной.