Gdy użytkownik wprowadza pewne zmiany (kadrowanie, usuwanie efektu czerwonych oczu, ...) do zdjęć we wbudowanej aplikacji Photos.app w systemie iOS, zmiany nie są stosowane do fullResolutionImage
zwracanych przez odpowiedni plikALAssetRepresentation
.
Jednak zmiany są stosowane do thumbnail
i fullScreenImage
zwracane przez ALAssetRepresentation
. Ponadto informacje o zastosowanych zmianach można znaleźć w ALAssetRepresentation
słowniku metadanych za pomocą klucza @"AdjustmentXMP"
.
Chciałbym zastosować te zmiany do fullResolutionImage
siebie, aby zachować spójność. Znalazłem, że na iOS6 + CIFilter
„s filterArrayFromSerializedXMP: inputImageExtent:error:
można przekonwertować ten XMP-metadane do tablicy 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];
}
Jednak działa to tylko w przypadku niektórych filtrów (kadrowanie, autoregulacja), ale nie w przypadku innych, takich jak usuwanie efektu czerwonych oczu. W takich przypadkach CIFilter
s nie mają widocznego efektu. Dlatego moje pytania:
- Czy ktoś zna sposób na usuwanie efektu czerwonych oczu
CIFilter
? (W pewnym sensie zgodnym z Photos.app. Filtr z kluczemkCIImageAutoAdjustRedEye
to za mało. Np. Nie bierze parametrów dla położenia oczu.) - Czy istnieje możliwość wygenerowania i zastosowania tych filtrów pod iOS 5?
Odpowiedzi:
źródło