-
Mejora el procesamiento de imágenes RAW con Core Image
Aprovecha la potencia de la versión 9 de las API de procesamiento RAW de Core Image para mejorar notablemente la calidad de imagen en tus apps, con una nitidez mejorada y colores más definidos, y utiliza el Neural Engine de Apple para obtener un rendimiento óptimo. Aprovecha la API CIRAWFilter para que los usuarios puedan editar fotos RAW modificando la exposición, la reducción de ruido, la nitidez, el contraste y mucho más. Además, explora las nuevas API CIImageProcessor, que optimizan el rendimiento gracias a un control preciso sobre el tamaño de los mosaicos y la administración del búfer.
Capítulos
- 0:00 - Introducción
- 0:52 - Compatibilidad de Core Image con archivos RAW
- 2:48 - La evolución de la compatibilidad con RAW
- 3:33 - Descripción general de RAW 9
- 3:56 - Mejoras de calidad en RAW 9
- 5:50 - Habilita y edita archivos RAW 9 con la API CIRAWFilter
- 8:33 - Descripción general del rendimiento de RAW 9
- 9:19 - Edición interactiva
- 10:52 - Exportación a otros formatos
- 11:50 - Nuevas funcionalidades de CIImageProcessor
Recursos
Videos relacionados
WWDC22
WWDC21
-
Buscar este video…
-
-
11:08 - Contact for exports
let exportCtx = CIContext(options : [ .cacheIntermediate : false, .memoryLimit : 512 ]) -
12:23 - CIImageProcessor with explicit output tile sizes
import CoreImage class MyProcessor: CIImageProcessorKernel { override class func roi(forInput input: Int32, arguments: [String : Any]?, outputRect: CGRect) -> CGRect { return outputRect } override class func process(with inputs: [CIImageProcessorInput]?, arguments: [String : Any]?, output: CIImageProcessorOutput) throws { guard let input = inputs?.first, let iBuffer = input.pixelBuffer, let oBuffer = output.pixelBuffer else { return } let iRegion = input.region let oRegion = output.region // controlled by Core Image // MyCopyBuffer(iBuffer,iRegion, oBuffer,oRegion) } } let extent = inImg.extent let tileSize = 512.0 // whatever tile size you want var tiles: [CIVector] = [] for y in stride(from: extent.minY, to: extent.maxY, by: tileSize) { for x in stride(from: extent.minX, to: extent.maxX, by: tileSize) { let tile = CGRect(x: x, y: y, width: min(tileSize, extent.maxX - x), height: min(tileSize, extent.maxY - y)) tiles.append(CIVector(cgRect: tile)) } } let result = try MyProcessor.apply(withTiledExtent: tiles, inputs: [inImg], arguments: [:]) -
14:24 - CIImageProcessor using temporary PixelBuffer
import CoreImage class MyProcessor: CIImageProcessorKernel { override class func process(with inputs: [CIImageProcessorInput]?, arguments: [String: Any]?, output: CIImageProcessorOutput) throws { guard let input = inputs?.first, let srcPixelBuffer = input.pixelBuffer, let dstPixelBuffer = output.pixelBuffer else { return } // Get a scratch buffer from Core Image's cache guard let scratch = output.temporaryPixelBuffer(identifier : "myScratch", format: kCVPixelFormatType_64RGBAHalf, width: Int(output.region.width), height: Int(output.region.height), pixelBufferAttributes: nil) else { return } // Step 1: copy input CVPixelBuffer → scratch // Step 2: process pixels in scratch // Step 3: copy scratch → output CVPixelBuffer } }
-