まず、上司と私の上司にも尋ねましたが、私の質問には答えていません。 - 同じ時間に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つあるときにデータを調整する方法です。どうもありがとうございます。私の質問はとても分かりやすいと思います。 ;)あなたの答えを楽しみにしています。
答えに感謝します。ええ、私は新しいCIFilterオブジェクトを作って間違いを犯しました。とにかく、私が知りたいのは、画像をPHAssetとして保存する方法です。 – Glenn
よろしくお願いします。あなたの保存ルーチンはどこで壊れていますか? – joelg
保存部分が私のdoneButtonActionメソッドにあります。私が言ったように、その方法は、一度に1つのフィルターしか適用しないときにうまく機能します。例:Posterize Filter。そのメソッドを呼び出したときに写真を変更するかどうかをユーザーに確認します。しかし、CIAffineClampでボケを適用すると、補完ハンドラでこのエラーが発生します。 - Error Domain = NSCocoaErrorDomain Code = -1 "(null)" – Glenn