Khi người dùng thực hiện một số thay đổi (cắt xén, loại bỏ mắt đỏ, ...) đối với ảnh trong ứng dụng Photos. tích hợp sẵn trên iOS, những thay đổi đó sẽ không được áp dụng cho ảnh được fullResolutionImage
trả về tương ứng ALAssetRepresentation
.
Tuy nhiên, những thay đổi được áp dụng cho thumbnail
và fullScreenImage
trả về bởi ALAssetRepresentation
. Hơn nữa, thông tin về các thay đổi được áp dụng có thể được tìm thấy trong ALAssetRepresentation
từ điển siêu dữ liệu của 'thông qua khóa @"AdjustmentXMP"
.
Tôi muốn áp dụng những thay đổi này cho fullResolutionImage
bản thân để duy trì tính nhất quán. Tôi đã phát hiện ra rằng trên iOS6 + CIFilter
's filterArrayFromSerializedXMP: inputImageExtent:error:
có thể chuyển đổi này XMP siêu dữ liệu tới một mảng của 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];
}
Tuy nhiên, điều này chỉ hoạt động đối với một số bộ lọc (cắt xén, tự động cải tiến) chứ không hiệu quả với những bộ lọc khác như loại bỏ mắt đỏ. Trong những trường hợp này, CIFilter
chúng không có tác dụng rõ ràng. Do đó, câu hỏi của tôi:
- Có ai biết về một cách để tạo ra loại bỏ mắt đỏ
CIFilter
không? (Theo một cách nhất quán với ứng dụng Photos. Bộ lọc có phímkCIImageAutoAdjustRedEye
là không đủ. Ví dụ: nó không lấy tham số cho vị trí của mắt.) - Có khả năng tạo và áp dụng các bộ lọc này trong iOS 5 không?