다음 코드는 사용자 라이브러리의 모든 사진에 대한 EXIF 데이터를 성공적으로 검사하고 주어진 위치와 가까운 지리적 위치에서 찍은 사진 배열을 완료 블록으로 전달합니다 해당 위치에서 찍은 가장 최근 사진의 NSDate
입니다.ALAssetsLibrary 위치에서 사진 가져 오기
- (void)getPhotosAtLocation:(CLLocation *)location withCompletionBlock:(void (^)(NSError *, NSDate *, NSMutableArray *))completionBlock {
NSMutableArray *photos = [NSMutableArray array];
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
__block NSDate *latestDate = [[NSDate alloc] initWithTimeIntervalSince1970:0];
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
if (result) {
ALAssetRepresentation *representation = [result defaultRepresentation];
NSDictionary *imageMetadata = [representation metadata];
NSLog(@"%@", imageMetadata);
//analyze location
if ([imageMetadata objectForKey:@"{GPS}"]) {
double latitude = [[[imageMetadata objectForKey:@"{GPS}"] objectForKey:@"Latitude"] doubleValue];
if ([[[imageMetadata objectForKey:@"{GPS}"] objectForKey:@"LatitudeRef"] isEqualToString:@"S"])
latitude *= -1;
double longitude = [[[imageMetadata objectForKey:@"{GPS}"] objectForKey:@"Longitude"] doubleValue];
if ([[[imageMetadata objectForKey:@"{GPS}"] objectForKey:@"LongitudeRef"] isEqualToString:@"W"])
longitude *= -1;
if (fabs(location.coordinate.latitude - latitude) <= 0.0005 && fabs(location.coordinate.longitude - longitude) <= 0.0005)
[photos addObject:[UIImage imageWithCGImage:[result thumbnail]]];
//analyze last time at location
if ([imageMetadata objectForKey:@"{TIFF}"]) {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy:MM:dd HH:mm:ss"];
NSDate *tempDate = [[NSDate alloc] init];
tempDate = [formatter dateFromString:[[imageMetadata objectForKey:@"{TIFF}"] objectForKey:@"DateTime"]];
if ([tempDate compare:latestDate] == NSOrderedDescending) {
latestDate = tempDate;
}
}
}
}
}];
if ([latestDate isEqualToDate:[NSDate dateWithTimeIntervalSince1970:0]])
completionBlock(nil, [NSDate date], photos);
else
completionBlock(nil, latestDate, photos);
} failureBlock:^(NSError *error) {
completionBlock(error, nil, nil);
}];
}
내가 직면하고있어 문제는 특정 위치에서 찍은 모든 사진을 찾기 위해, 나는 (O를 가지고 사용자의 카메라 롤에서 모든 사진을 통해 선형 반복해야한다는 것입니다 (n)의 시간). 반복하기 전에 위도와 경도로 사진 순서를 정하도록함으로써이 과정을 신속하게 처리 할 수 있습니까? 어떤 종류의 알고리즘이 관련 이미지를 반환하는 데 걸리는 시간을 최소화 할 수 있습니까?
가능합니다. 당신이 말하는 것은 적어도 현재 사용자의 라이브러리에있는 사진 수 (n)를 캐시하고 다음에 인덱스 n (라이브러리의 첫 번째 새 사진)에서 검색을 시작하는 것입니다. 물론, 문제는 처음부터 모든 사진을 한 번 이상 반복해야한다는 것입니다. 현재 휴대 전화의 저장 용량을 수용하면 수천 개의 저장된 사진을 반복 할 수 있습니다. –
사진을 캐시 (n)하지만 삭제 된 사진도 준비하십시오. 반복 자체가 오랜 시간이 걸리거나 프로세스 속도를 늦추는 메타 데이터 검사입니까? 매번 수천 장의 사진을 반복 할 생각 이었지만 캐시 된 사본이 없다면 메타 데이터 만 확인하십시오. – gWiz