2016-03-31 9 views
1

まず、上司と私の上司にも尋ねましたが、私の質問には答えていません。 - 同じ時間に2つのフィルターが適用されたファセットを保存する方法は?CIGaussianBlurとCIAffineClampでPHAssetを保存する

資産(写真/動画)のメタデータを編集するためにPHAssetsを使用するプロジェクトがあります。今、タグとフィルターを適用して画像を修正できます。この例を参照してください:http://dev.classmethod.jp/references/ios8-photo-kit-4/

私は最近CIGaussianBlurによって生成された余分な境界線についての問題を抱えていたし、私は問題を解決するためにCIAffineClampフィルタを持っている必要があることを学んだ:CIGaussianBlur and CIAffineClamp on iOS 6

残念ながら、私は保存する方法がわかりませんPHAを設定するか、適用する必要があるフィルタが2つある場合はPHAセットを変更します。ここに私のコードは2つのフィルタを適用するには:

// G: If Blur, then adjust first the frame before applying blur! 
    if ([filterName isEqualToString:@"CIGaussianBlur"]) 
    { 
     [filter setValue:inputImageForFilter forKey:@"inputImage"]; 
     CGFloat blurLevel = 20.0f; 
     [filter setValue:[NSNumber numberWithFloat:blurLevel] forKey:@"inputRadius"]; 

     CIImage* filterInputImage = [CIImage imageWithCGImage:originalImage.CGImage]; 
     CIFilter* filter = [CIFilter filterWithName:filterName]; 

     CIFilter *clampFilter = [CIFilter filterWithName:@"CIAffineClamp"]; 
     [clampFilter setDefaults]; 
     [clampFilter setValue:filterInputImage forKey:kCIInputImageKey]; 

     [filter setValue:clampFilter.outputImage forKey:kCIInputImageKey]; 
     [filter setValue:@10.0f forKey:@"inputRadius"]; 

     CIImage* filterOutputImage = [filter valueForKey:kCIOutputImageKey]; 

     CGImageRef createdImage = [context createCGImage:filterOutputImage fromRect:[filterInputImage extent]]; 
     UIImage* outputImage = [UIImage imageWithCGImage:createdImage]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      strongSelf.capturedImageView.image = outputImage; 
      strongSelf.capturedImageView.contentMode = UIViewContentModeScaleAspectFit; 
      [strongSelf.capturedImageView layoutSubviews]; 
     }); 

     strongSelf.appliedFilter.filterName = filterName; 
     strongSelf.appliedFilter.editingInput = contentEditingInput; 
     strongSelf.appliedFilter.outputImage = filterOutputImage; 

     CGImageRelease(createdImage); 
     createdImage = nil; 
    } 

そしてここでは、私のコードは、データを保存するには:

再び
- (void)doneButtonAction:(id)sender 
{ 
    // G: Handle Nil FilterName for Fixing Crash :) 
    if (self.appliedFilter.filterName == nil) { 
     // G: just pop to the view controller next to root, which is the Camera View Controller in Photo Mode. 
     [self.navigationController popToViewController:self.navigationController.viewControllers[1] animated:YES]; 
    } 

    else{ 
     // Create a PHAdjustmentData object that describes the filter that was applied. 
     PHAdjustmentData *adjustmentData = [[PHAdjustmentData alloc] initWithFormatIdentifier:AdjustmentFormatIdentifier formatVersion:@"1.0" data:[self.appliedFilter.filterName dataUsingEncoding:NSUTF8StringEncoding]]; 

     PHAdjustmentData *affineClamp = [[PHAdjustmentData alloc] initWithFormatIdentifier:AdjustmentFormatIdentifier formatVersion:@"1.0" data:[@"CIAffineClamp" dataUsingEncoding:NSUTF8StringEncoding]]; 

     /* 
     Create a PHContentEditingOutput object and write a JPEG representation 
     of the filtered object to the renderedContentURL. 
     */ 
     PHContentEditingOutput *contentEditingOutput = [[PHContentEditingOutput alloc] initWithContentEditingInput:self.appliedFilter.editingInput]; 
     NSData *jpegData = [self.appliedFilter.outputImage aapl_jpegRepresentationWithCompressionQuality:0.9f]; 
     [jpegData writeToURL:[contentEditingOutput renderedContentURL] atomically:YES]; 
     [contentEditingOutput setAdjustmentData:adjustmentData]; 

     if ([self.appliedFilter.filterName isEqualToString:@"CIGaussianBlur"]) { 
      [contentEditingOutput setAdjustmentData:affineClamp]; 
     } 

     // Ask the shared PHPhotoLinrary to perform the changes. 
     [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ 
      PHAssetChangeRequest *request = [PHAssetChangeRequest changeRequestForAsset:self.photo.asset]; 
      request.contentEditingOutput = contentEditingOutput; 
     } completionHandler:^(BOOL success, NSError *error) { 
      if (!success) { 
       NSLog(@"Error: %@", error); 
      } 
     }]; 

     // G: just pop to the view controller next to root, which is the Camera View Controller in Photo Mode. 
     [self.navigationController popToViewController:self.navigationController.viewControllers[1] animated:YES]; 

    } 

} 

私は唯一の1つのフィルタにしている場合、データ部分のコードを保存することは非常にうまく機能します適用する。もう一度、私の問題は、適用するフィルタが2つあるときにデータを調整する方法です。どうもありがとうございます。私の質問はとても分かりやすいと思います。 ;)あなたの答えを楽しみにしています。

答えて

0

まず、エラーを出さずに*フィルタをどのように再宣言できるかわかりません(最初にコントロール構造体の外で宣言し、その中で宣言し直す必要があります)。

ここでは、ぼかしを適用し、探している範囲で画像を返す単純なルーチンを示します。

- (CIImage*)blurImage:(CIImage*)sourceImage withRadius:(NSNumber*)blurRadius { 

    CGRect originalExtent = sourceImage.extent; 

    CIImage *clampedImaged = [sourceImage imageByClampingToExtent]; 

    CIImage *blurredImage = [clampedImaged imageByApplyingFilter:@"CIGaussianBlur" withInputParameters:@{@"inputRadius" : blurRadius}]; 

    return [blurredImage imageByCroppingToRect:originalExtent]; 
} 

そうでなければ、私はoriginalImageまたはinputImageForFilterが参照しているかを伝えることはできませんので、ハングアップがどこにあるかを提案することは困難です。この行をデバッグするには、行ごとにXcodeのpeek関数(眼球アイコン)を使用して、各フィルタから生成されたCIImageオブジェクトが期待どおりのものであることを確認します。

+0

答えに感謝します。ええ、私は新しいCIFilterオブジェクトを作って間違いを犯しました。とにかく、私が知りたいのは、画像をPHAssetとして保存する方法です。 – Glenn

+0

よろしくお願いします。あなたの保存ルーチンはどこで壊れていますか? – joelg

+0

保存部分が私のdoneButtonActionメソッドにあります。私が言ったように、その方法は、一度に1つのフィルターしか適用しないときにうまく機能します。例:Posterize Filter。そのメソッドを呼び出したときに写真を変更するかどうかをユーザーに確認します。しかし、CIAffineClampでボケを適用すると、補完ハンドラでこのエラーが発生します。 - Error Domain = NSCocoaErrorDomain Code = -1 "(null)" – Glenn

関連する問題