ALAssetRepresentation에서 XMP 메타 데이터 해석


95

사용자가 iOS 의 내장 Photos.app 에서 사진을 일부 변경 (자르기, 적목 제거 등)하면 해당 변경 사항이 fullResolutionImage해당 ALAssetRepresentation.

그러나, 변경 사항이 적용됩니다 thumbnail와는 fullScreenImage에 의해 반환 ALAssetRepresentation. 또한 적용된 변경 사항에 대한 정보 ALAssetRepresentation는 키를 통해의 메타 데이터 사전 에서 찾을 수 있습니다 @"AdjustmentXMP".

fullResolutionImage일관성을 유지하기 위해 이러한 변경 사항을 나 자신에게 적용하고 싶습니다 . 내가 발견 한 그에 iOS6의 + CIFilterfilterArrayFromSerializedXMP: inputImageExtent:error:배열이 XMP-메타 데이터를 변환 할 수 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];
}

그러나 이것은 일부 필터 (자르기, 자동 향상)에서만 작동하고 적목 제거와 같은 다른 필터에서는 작동하지 않습니다. 이 경우 CIFilters는 눈에 띄는 효과가 없습니다. 따라서 내 질문 :

  • 적목 제거 방법을 알고있는 사람이 CIFilter있습니까? (Photos.app과 일치합니다. 키 kCIImageAutoAdjustRedEye가 있는 필터로는 충분하지 않습니다. 예를 들어 눈의 위치에 대한 매개 변수를 사용하지 않습니다.)
  • iOS 5에서 이러한 필터를 생성하고 적용 할 수 있습니까?

이 링크는 적목 현상에 대한 알고리즘을 제공하는 또 다른 Stackoverflow 질문에 대한 것입니다. 많지는 않지만 시작입니다. stackoverflow.com/questions/133675/red-eye-reduction-algorithm
Roecrew

iOS 7에서 나열된 코드는 적목 제거 필터 (CIRedEyeCorrections 내부 필터)를 올바르게 적용합니다.
paiv

답변:


2
ALAssetRepresentation* representation = [[self assetAtIndex:index] defaultRepresentation];

// Create a buffer to hold the data for the asset's image
uint8_t *buffer = (Byte*)malloc(representation.size); // Copy the data from the asset into the buffer
NSUInteger length = [representation getBytes:buffer fromOffset: 0.0  length:representation.size error:nil];

if (length==0)
    return nil;

// Convert the buffer into a NSData object, and free the buffer after.

NSData *adata = [[NSData alloc] initWithBytesNoCopy:buffer length:representation.size freeWhenDone:YES];

// Set up a dictionary with a UTI hint. The UTI hint identifies the type
// of image we are dealing with (that is, a jpeg, png, or a possible
// RAW file).

// Specify the source hint.

NSDictionary* sourceOptionsDict = [NSDictionary dictionaryWithObjectsAndKeys:

(id)[representation UTI], kCGImageSourceTypeIdentifierHint, nil];

// Create a CGImageSource with the NSData. A image source can
// contain x number of thumbnails and full images.

CGImageSourceRef sourceRef = CGImageSourceCreateWithData((CFDataRef) adata,  (CFDictionaryRef) sourceOptionsDict);

[adata release];

CFDictionaryRef imagePropertiesDictionary;

// Get a copy of the image properties from the CGImageSourceRef.

imagePropertiesDictionary = CGImageSourceCopyPropertiesAtIndex(sourceRef,0, NULL);

CFNumberRef imageWidth = (CFNumberRef)CFDictionaryGetValue(imagePropertiesDictionary, kCGImagePropertyPixelWidth);

CFNumberRef imageHeight = (CFNumberRef)CFDictionaryGetValue(imagePropertiesDictionary, kCGImagePropertyPixelHeight);

int w = 0;

int h = 0;

CFNumberGetValue(imageWidth, kCFNumberIntType, &w);

CFNumberGetValue(imageHeight, kCFNumberIntType, &h);

// Clean up memory

CFRelease(imagePropertiesDictionary);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.