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는 처음부터 제대로 초기화되지 않았습니다. 하지만 난 이유를 모르겠다. 지금 몇 시간 동안 있었어.
도움 주셔서 감사합니다.
건배