Чтобы отразить NSImage
с помощью подпрограмм зеркалирования vImage , вы можете сделать что-то вроде:
extension NSImage {
func mirrored() -> NSImage? {
guard
let cgImage = cgImage(forProposedRect: nil, context: nil, hints: nil),
let colorSpace = cgImage.colorSpace else {
return nil
}
var format = vImage_CGImageFormat(bitsPerComponent: UInt32(cgImage.bitsPerComponent),
bitsPerPixel: UInt32(cgImage.bitsPerPixel),
colorSpace: Unmanaged.passRetained(colorSpace),
bitmapInfo: cgImage.bitmapInfo,
version: 0,
decode: nil,
renderingIntent: cgImage.renderingIntent)
var source = vImage_Buffer()
var result = vImageBuffer_InitWithCGImage(
&source,
&format,
nil,
cgImage,
vImage_Flags(kvImageNoFlags))
guard result == kvImageNoError else { return nil }
defer { free(source.data) }
var destination = vImage_Buffer()
result = vImageBuffer_Init(
&destination,
vImagePixelCount(cgImage.height),
vImagePixelCount(cgImage.width),
UInt32(cgImage.bitsPerPixel),
vImage_Flags(kvImageNoFlags))
guard result == kvImageNoError else { return nil }
result = vImageHorizontalReflect_ARGB8888(&source, &destination, vImage_Flags(kvImageNoFlags))
guard result == kvImageNoError else { return nil }
defer { free(destination.data) }
return vImageCreateCGImageFromBuffer(&destination, &format, nil, nil, vImage_Flags(kvImageNoFlags), nil).map {
NSImage(cgImage: $0.takeRetainedValue(), size: size)
}
}
}
Таким образом, сделав снимок экрана вышеупомянутого в моем редакторе, я тогдаmirrored
изображение, в результате чего: