0

SOで答えを探し回った。興味深いものを見つけましたが、まだ立ち往生しています。

ビューコントローラーには、ビューの読み込み時に UIImagePicker から取得した画像を設定する UIImageView があります。(CIImageも同時に設定しています)

2 つのスライダー (明るさ用、コントラスト用) があります。スライダーを動かすと、フィルターが CIImage に適用され、CIImage が UIImageView の UIImage にレンダリングされます。

最初に、UIImagePicker から取得した UIImage は、最初に選択したときに正しく表示されます。

また、スライダーの範囲を正しく設定し、適切な float 値がデリゲート関数に (NSLog を介して) 渡されていることを確認しました。

ただし、スライダーをいじってみると、UIImageView が白くなります。もしかしたら、あなた方が助けてくれるかもしれません。いくつかのコード スニペットを投稿します。

まず、私の @interface:

@interface PrepViewController : UIViewController <UIImagePickerControllerDelegate , UINavigationControllerDelegate>

@property (weak, nonatomic) IBOutlet UIImageView *editingImage;
@property (weak, nonatomic) CIImage *editingCIImage;
@property (weak, nonatomic) CIContext *editingCIContext;
@property (weak, nonatomic) CIFilter *editingCIFilter;
@property (nonatomic) BOOL didAskForImage;
@property (weak, nonatomic) IBOutlet UISlider *brightnessSlider;
@property (weak, nonatomic) IBOutlet UISlider *contrastSlider;


- (void) doImageFilter:(NSString *)filter withValue:(float)value;

@end

私のviewDidLoadは、非常に単純で、didAskForImageをNOに設定するだけです

- (void)viewDidLoad
{

    [super viewDidLoad];

    self.didAskForImage = NO;

}

viewDidAppear は、既に画像を要求したかどうかを確認してから要求する場所です

- (void)viewDidAppear:(BOOL)animated{

[super viewDidAppear:animated];

if(!self.didAskForImage){

    UIImagePickerController *picker = [[UIImagePickerController alloc] init];

    picker.delegate = self;
    picker.allowsEditing = NO;

    UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        sourceType = UIImagePickerControllerSourceTypeCamera;
    }

    picker.sourceType = sourceType;

    [self presentModalViewController:picker animated:YES];

}


}

これが imagePickerController didFinishPickingImage デリゲート メソッドです。これは、実際に UIImageView の画像プロパティを設定し、CIImage、CIContext、および CIFilter オブジェクトを初期化する場所です。

また、didAskForImage ブール値とスライダー ターゲットも設定しました。

-(void)imagePickerController:(UIImagePickerController *)picker
  didFinishPickingImage : (UIImage *)image
             editingInfo:(NSDictionary *)editingInfo
{

self.didAskForImage = YES;

self.editingImage.image = image;

self.editingCIImage = [[CIImage alloc] initWithImage:image];
self.editingCIContext = [CIContext contextWithOptions:nil];


self.editingCIContext = [CIContext contextWithOptions:nil];
self.editingCIFilter = [CIFilter filterWithName:@"CIColorControls" keysAndValues:kCIInputImageKey, self.editingCIImage, nil];

[self.contrastSlider addTarget:self action:@selector(contrastMove:) forControlEvents:UIControlEventValueChanged];

[self.brightnessSlider addTarget:self action:@selector(brightnessMove:) forControlEvents:UIControlEventValueChanged];

[picker dismissModalViewControllerAnimated:YES];
}

およびキャンセルデリゲート

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)  picker
{
[picker dismissModalViewControllerAnimated:YES];
picker = nil;
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES];

}

スライダーのデリゲート メソッドは次のとおりです。ここでも、NSLogs に期待値が表示されます。

- (void) contrastMove:(id)sender{

NSLog(@"%f", [(UISlider *)sender value]);

[self doImageFilter:@"inputContrast" withValue:[(UISlider *)sender value]];

}

- (void) brightnessMove:(id)sender{

NSLog(@"%f", [(UISlider *)sender value]);

[self doImageFilter:@"inputBrightness" withValue:[(UISlider *)sender value]];

}

最後に、私が作成した doImageFilter メソッドを次に示します。これは実際フィルターを実行し、UIImageView を再割り当てします (ここで白くなります)。

- (void) doImageFilter:(NSString *)filter withValue:(float)value{

[self.editingCIFilter setValue:[NSNumber numberWithFloat:value] forKey:filter];

CIImage *output = [self.editingCIFilter outputImage];
CGImageRef cgi = [self.editingCIContext createCGImage:output fromRect:[output extent]];

self.editingCIImage = output;
self.editingImage.image = [UIImage imageWithCGImage:cgi];

}

したがって、そもそも CIImage が適切に初期化されていないという予感があります。しかし、理由はわかりません。これで数時間過ごしました。

ご助力いただきありがとうございます!

乾杯

4

1 に答える 1

1

ははは、うわぁ。

だから私はそれを理解しました.CIContextとCIFilterは弱いのではなく強いに設定する必要があります.

素晴らしい。

于 2012-06-28T23:47:55.683 に答える