Чтобы сделать снимок экрана, вам нужно получить MTLTexture
буфера кадра.
1. Если вы используете MTKView
:
let texture = view.currentDrawable!.texture
2. Если вы не используете MTKView
Вот что я бы сделал - у меня было бы свойство, содержащее последний вывод, представленный на экране:
let lastDrawableDisplayed: CAMetalDrawable?
И затем, когда вы представляете возможность рисования на экране, я бы обновил его:
let commandBuffer = commandQueue.commandBuffer()
commandBuffer.addCompletedHandler { buffer in
self.lastDrawableDisplayed = drawable
}
Теперь, когда вам нужно сделать снимок экрана, вы можете получить такую текстуру:
let texture = lastDrawableDisplayed.texture
Хорошо, теперь, когда у вас есть MTLTexture
, вы можете преобразовать его в CGImage
, а затем в UIImage
или NSImage
.
Вот код для игровой площадки OS X (MetalKit.MTLTextureLoader недоступен для игровых площадок iOS), в котором я конвертирую MTLTexture
в CGImage
Я сделал для этого небольшое расширение над MTLTexture
.
import Metal
import MetalKit
import Cocoa
let device = MTLCreateSystemDefaultDevice()!
let textureLoader = MTKTextureLoader(device: device)
let path = "path/to/your/image.jpg"
let data = NSData(contentsOfFile: path)!
let texture = try! textureLoader.newTextureWithData(data, options: nil)
extension MTLTexture {
func bytes() -> UnsafeMutablePointer<Void> {
let width = self.width
let height = self.height
let rowBytes = self.width * 4
let p = malloc(width * height * 4)
self.getBytes(p, bytesPerRow: rowBytes, fromRegion: MTLRegionMake2D(0, 0, width, height), mipmapLevel: 0)
return p
}
func toImage() -> CGImage? {
let p = bytes()
let pColorSpace = CGColorSpaceCreateDeviceRGB()
let rawBitmapInfo = CGImageAlphaInfo.NoneSkipFirst.rawValue | CGBitmapInfo.ByteOrder32Little.rawValue
let bitmapInfo:CGBitmapInfo = CGBitmapInfo(rawValue: rawBitmapInfo)
let selftureSize = self.width * self.height * 4
let rowBytes = self.width * 4
let provider = CGDataProviderCreateWithData(nil, p, selftureSize, nil)
let cgImageRef = CGImageCreate(self.width, self.height, 8, 32, rowBytes, pColorSpace, bitmapInfo, provider, nil, true, CGColorRenderingIntent.RenderingIntentDefault)!
return cgImageRef
}
}
if let imageRef = texture.toImage() {
let image = NSImage(CGImage: imageRef, size: NSSize(width: texture.width, height: texture.height))
}
person
haawa
schedule
24.11.2015