2

基于 SamplePhotosApp 中的这段代码:

- (void)applyFilterWithName:(NSString *)filterName {
    PHContentEditingInputRequestOptions *options = [[PHContentEditingInputRequestOptions alloc] init];
    [options setCanHandleAdjustmentData:^BOOL(PHAdjustmentData *adjustmentData) {
        return [adjustmentData.formatIdentifier isEqualToString:AdjustmentFormatIdentifier] && [adjustmentData.formatVersion isEqualToString:@"1.0"];
    }];

    [self.asset requestContentEditingInputWithOptions:options completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
        NSURL *url = [contentEditingInput fullSizeImageURL];
        int orientation = [contentEditingInput fullSizeImageOrientation];
        CIImage *inputImage = [CIImage imageWithContentsOfURL:url options:nil];
        inputImage = [inputImage imageByApplyingOrientation:orientation];

        // Add filter
        CIFilter *filter = [CIFilter filterWithName:filterName];
        [filter setDefaults];
        [filter setValue:inputImage forKey:kCIInputImageKey];
        CIImage *outputImage = [filter outputImage];

        // Create editing output
        NSData *jpegData = [outputImage aapl_jpegRepresentationWithCompressionQuality:0.9f];
        PHAdjustmentData *adjustmentData = [[PHAdjustmentData alloc] initWithFormatIdentifier:AdjustmentFormatIdentifier formatVersion:@"1.0" data:[filterName dataUsingEncoding:NSUTF8StringEncoding]];

        PHContentEditingOutput *contentEditingOutput = [[PHContentEditingOutput alloc] initWithContentEditingInput:contentEditingInput];
        [jpegData writeToURL:[contentEditingOutput renderedContentURL] atomically:YES];
        [contentEditingOutput setAdjustmentData:adjustmentData];

        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
            PHAssetChangeRequest *request = [PHAssetChangeRequest changeRequestForAsset:self.asset];
            request.contentEditingOutput = contentEditingOutput;
        } completionHandler:^(BOOL success, NSError *error) {
            if (!success) {
                NSLog(@"Error: %@", error);
            }
        }];
    }];
}

我创建了自己的将过滤器应用于图像的实现。我的代码:

- (void)saveAsset:(PHAsset *)asset withEdits:(NSDictionary *)edits withCompletion:(successBlock)block {
    PHContentEditingInputRequestOptions *options = [[PHContentEditingInputRequestOptions alloc] init];
    [options setCanHandleAdjustmentData:^BOOL(PHAdjustmentData *adjustmentData) {
        return [adjustmentData.formatIdentifier isEqualToString:@"myID"] && [adjustmentData.formatVersion isEqualToString:@"1.0"];
    }];

    [asset requestContentEditingInputWithOptions:options completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
        NSURL *fullImageURL = [contentEditingInput fullSizeImageURL];
        UIImage *fullSizeImage = [UIImage imageWithContentsOfFile:[fullImageURL path]];
        UIImage *editedImage = [EngineImageFilters applyEffects:edits[@"filters"] toImages:@[fullSizeImage] withValue:@(ImageFilterValueTypeCustom)][0];
        NSData *imageData = UIImageJPEGRepresentation(editedImage, 1.0);
        NSData *editData = [NSJSONSerialization dataWithJSONObject:edits options:0 error:nil];
        PHAdjustmentData *adjustmentData = [[PHAdjustmentData alloc] initWithFormatIdentifier:@"profcam" formatVersion:@"1.0" data:editData];
        PHContentEditingOutput *output = [[PHContentEditingOutput alloc] initWithContentEditingInput:contentEditingInput];
        [imageData writeToURL:[output renderedContentURL] atomically:YES];
        [output setAdjustmentData:adjustmentData];

        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
            PHAssetChangeRequest *request = [PHAssetChangeRequest changeRequestForAsset:asset];
            request.contentEditingOutput = output;
        } completionHandler:^(BOOL success, NSError *error) {
            if (block) {
                block(success, error);
            }
        }];
    }];
}

由于许多值为零,我的片段将导致崩溃。requestContentEditingWithOptions:completionHandler 方法为 PHContentEditingInput 提供 nil,这会导致文件 url 为 nil 等许多问题。似乎 setCanHandleAdjustmentData 块也从未被调用 - 也许这就是 PHContentEditingInput 为 nil 的原因。无论如何,我应该如何解决这个问题?

4

0 回答 0