Quando um usuário faz algumas alterações (corte, remoção de olhos vermelhos, ...) em fotos no Photos.app integrado no iOS, as alterações não são aplicadas ao fullResolutionImage
retornado pelo correspondente ALAssetRepresentation
.
No entanto, as alterações são aplicadas ao thumbnail
e ao fullScreenImage
retornado pelo ALAssetRepresentation
. Além disso, informações sobre as alterações aplicadas podem ser encontradas no ALAssetRepresentation
dicionário de metadados de por meio da chave @"AdjustmentXMP"
.
Eu gostaria de aplicar essas alterações a fullResolutionImage
mim mesmo para preservar a consistência. Eu descobri que em iOS6 + CIFilter
's filterArrayFromSerializedXMP: inputImageExtent:error:
pode converter este XMP metadados para uma matriz de CIFilter
' s:
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];
}
No entanto, isso funciona apenas para alguns filtros (corte, aprimoramento automático), mas não para outros, como remoção de olhos vermelhos. Nestes casos, os CIFilter
s não têm efeito visível. Portanto, minhas perguntas:
- Alguém sabe de uma maneira de criar a remoção de olhos vermelhos
CIFilter
? (De forma consistente com o Photos.app. O filtro com a chavekCIImageAutoAdjustRedEye
não é suficiente. Por exemplo, não leva parâmetros para a posição dos olhos.) - Existe a possibilidade de gerar e aplicar esses filtros no iOS 5?