Справка по Core Image: установка CIImage из UIImage через UIImagePicker (затем фильтрация)

Поискал на SO ответ. Нашел кое-что интересное, но я все еще застрял.

В контроллере представления у меня есть UIImageView, для которого я устанавливаю изображение, взятое из UIImagePicker при загрузке представления. (Я также установил CIImage одновременно)

У меня есть два ползунка (один для яркости, один для контраста). При перемещении ползунка к CIImage применяется фильтр, затем CIImage визуализируется в UIImage UIImageView.

Во-первых, UIImage, взятый из UIImagePicker, отображается правильно при первом выборе.

У меня также правильно установлены диапазоны ползунка, и я проверил, что правильные значения с плавающей запятой передаются функциям делегата (через 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 даже не инициализируется должным образом; но я не знаю, почему. Был на этом в течение пары часов.

Спасибо за вашу помощь!

Ваше здоровье


person Doug    schedule 28.06.2012    source источник


Ответы (1)


Хахаха, о вау.

Итак, я понял, что мои CIContext и CIFilter должны быть установлены сильными, а не слабыми.

Потрясающий.

person Doug    schedule 28.06.2012