-
Améliorez le traitement des images RAW avec Core Image
Exploitez la puissance de la version 9 des API de traitement RAW de Core Image pour améliorer de manière spectaculaire la qualité d'image dans vos apps, avec une netteté accrue et des couleurs plus précises, tout en utilisant le Neural Engine d'Apple pour des performances optimales. Grâce à l'API CIRAWFilter, offrez à vos utilisateurs la possibilité de retoucher des photos RAW en ajustant l'exposition, la réduction du bruit, la netteté, le contraste et bien d'autres paramètres. Et explorez les nouvelles API CIImageProcessor qui optimisent les performances en vous donnant un contrôle précis sur le dimensionnement des tuiles et la gestion des tampons.
Chapitres
- 0:00 - Introduction
- 0:52 - Comment Core Image prend en charge le RAW
- 2:48 - L’évolution de la prise en charge du RAW
- 3:33 - Présentation de RAW 9
- 3:56 - Améliorations de la qualité de RAW 9
- 5:50 - Activer et modifier RAW 9 avec l’API CIRAWFilter
- 8:33 - Présentation des performances de RAW 9
- 9:19 - Édition interactive
- 10:52 - Exportation vers d’autres formats
- 11:50 - Nouvelles fonctionnalités de CIImageProcessor
Ressources
Vidéos connexes
WWDC22
WWDC21
-
Rechercher dans cette vidéo…
-
-
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 } }
-