2012-06-28 1 views
0

SO에서 답변을 검색했습니다. 흥미있는 물건을 발견했지만 나는 아직도 붙어있다.코어 이미지 도움말 : UIImagePicker를 통해 UIImage에서 CIImage를 설정 (필터링 한 후)

보기 컨트롤러에서보기가로드 될 때 UIImagePicker에서 가져온 이미지를 설정하는 UIImageView가 있습니다. (나는 또한 CIImage를 동시에 설정했습니다.)

두 개의 슬라이더 (밝기 용, 명암 용)가 있습니다. 슬라이더를 움직이면 CIImage에 필터가 적용되고 CIImage가 UIImageView의 UIImage로 렌더링됩니다.

주먹을 끄면 UIImagePicker에서 가져온 UIImage가 처음 선택되었을 때 올바르게 표시됩니다.

또한 슬라이더 범위가 올바르게 설정되어 있고 적절한 float 값이 NSLog를 통해 대리자 기능에 전달되고 있는지 확인했습니다.

그러나 슬라이더를 가지고 놀려고하면 UIImageView가 흰색으로 바뀝니다. 아마 사람들이 도울 수 있습니다. 나는 '만약 내가 확인 어디에 단지 NO

- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 

    self.didAskForImage = NO; 

} 

viewDidAppear에 didAskForImage을 설정

@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에 꽤 간단하다, 내 @ 인터페이스를

첫째, 나는 몇 가지 코드 조각을 게시합니다 이미 이미지를 요청한 다음 요청하십시오.

- (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 didFin이 있습니다. ishPickingImage 대리자 메서드 이것은 실제로 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]; 

} 

취소는 슬라이더 '위임 방법이다. 다시 말하지만, NSLog는 예상 값을 표시합니다.

- (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]]; 

} 

그리고 마지막으로, 여기에 실제로 필터를 수행하고있는 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]; 

} 

그래서 나는 직감을 재 할당 내가 만든 doImageFilter 방법은입니다 CIImage는 처음부터 제대로 초기화되지 않았습니다. 하지만 난 이유를 모르겠다. 지금 몇 시간 동안 있었어.

도움 주셔서 감사합니다.

건배

답변

1

하하하, 오 와우.

그래서 CIContext와 CIFilter를 약하게 대신 강하게 설정해야합니다.

굉장합니다.