depth-anything-example/Common/CoreImageExtensions.swift (40 lines of code) (raw):
import CoreImage
import ImageIO
import UniformTypeIdentifiers
extension CIImage {
/// Returns a resized image.
func resized(to size: CGSize) -> CIImage {
let outputScaleX = size.width / extent.width
let outputScaleY = size.height / extent.height
var outputImage = self.transformed(by: CGAffineTransform(scaleX: outputScaleX, y: outputScaleY))
outputImage = outputImage.transformed(
by: CGAffineTransform(translationX: -outputImage.extent.origin.x, y: -outputImage.extent.origin.y)
)
return outputImage
}
}
extension CIContext {
/// Renders an image to a new pixel buffer.
func render(_ image: CIImage, pixelFormat: OSType) -> CVPixelBuffer? {
var output: CVPixelBuffer!
let status = CVPixelBufferCreate(
kCFAllocatorDefault,
Int(image.extent.width),
Int(image.extent.height),
pixelFormat,
nil,
&output
)
guard status == kCVReturnSuccess else {
return nil
}
render(image, to: output)
return output
}
/// Writes the image as a PNG.
func writePNG(_ image: CIImage, to url: URL) {
let outputCGImage = createCGImage(image, from: image.extent)!
guard let destination = CGImageDestinationCreateWithURL(url as CFURL, UTType.png.identifier as CFString, 1, nil) else {
fatalError("Failed to create an image destination.")
}
CGImageDestinationAddImage(destination, outputCGImage, nil)
CGImageDestinationFinalize(destination)
}
}