Quando un utente apporta alcune modifiche (ritaglio, rimozione occhi rossi, ...) alle foto nell'app Photos.app integrata su iOS, le modifiche non vengono applicate al fullResolutionImage
restituito dal file ALAssetRepresentation
.
Tuttavia, le modifiche vengono applicate a thumbnail
e fullScreenImage
restituite da ALAssetRepresentation
. Inoltre, le informazioni sulle modifiche applicate possono essere trovate nel ALAssetRepresentation
dizionario dei metadati di tramite la chiave @"AdjustmentXMP"
.
Vorrei applicare queste modifiche al fullResolutionImage
me stesso per preservare la coerenza. Ho scoperto che su iOS6 + CIFilter
è filterArrayFromSerializedXMP: inputImageExtent:error:
possibile convertire questi metadati XMP in un array di CIFilter
:
ALAssetRepresentation *rep;
NSString *xmpString = rep.metadata[@"AdjustmentXMP"];
NSData *xmpData = [xmpString dataUsingEncoding:NSUTF8StringEncoding];
CIImage *image = [CIImage imageWithCGImage:rep.fullResolutionImage];
NSError *error = nil;
NSArray *filterArray = [CIFilter filterArrayFromSerializedXMP:xmpData
inputImageExtent:image.extent
error:&error];
if (error) {
NSLog(@"Error during CIFilter creation: %@", [error localizedDescription]);
}
CIContext *context = [CIContext contextWithOptions:nil];
for (CIFilter *filter in filterArray) {
[filter setValue:image forKey:kCIInputImageKey];
image = [filter outputImage];
}
Tuttavia, questo funziona solo per alcuni filtri (ritaglio, miglioramento automatico) ma non per altri come la rimozione degli occhi rossi. In questi casi, le CIFilter
s non hanno alcun effetto visibile. Pertanto, le mie domande:
- Qualcuno è a conoscenza di un modo per creare la rimozione degli occhi rossi
CIFilter
? (In un modo coerente con Photos.app. Il filtro con la chiavekCIImageAutoAdjustRedEye
non è sufficiente. Ad esempio, non prende parametri per la posizione degli occhi.) - C'è la possibilità di generare e applicare questi filtri con iOS 5?