2015-01-26 7 views
2

Я использую GPUImage в своем приложении, и я застреваю, пытаясь изменить яркость и контрастность изображения.GPUImage GroupFilter, Brightness and Contrast iOS

Я создал GPUImageView с исходным изображением, а также установить фильтр яркости и контрастности фильтр, который будет изменен с UISlider

Так вот мой код:

первый на всех

. ч

__weak IBOutlet GPUImageView* imageView; 

.m

GPUImagePicture* sourcePicture; 
GPUImageBrightnessFilter *brightnessFilter; 
GPUImageContrastFilter *contrastFilter; 

когда мой контроллер зрения, загружен я следующую вещь:

UIImage* image = "[image fromAnotherViewController]"; 
sourcePicture = [[GPUImagePicture alloc] initWithImage:image smoothlyScaleOutput:YES]; 

brightnessFilter = [[GPUImageBrightnessFilter alloc] init]; 
contrastFilter = [[GPUImageContrastFilter alloc] init]; 

[brightnessFilter forceProcessingAtSize:imageView.sizeInPixels]; 
[contrastFilter forceProcessingAtSize:imageView.sizeInPixels]; 

[sourcePicture addTarget:brightnessFilter]; 
[brightnessFilter addTarget:contrastFilter]; 

[contrastFilter addTarget:imageViewBewo]; 

[sourcePicture processImage]; 

и здесь контраст и значение яркости изменили методы

- (IBAction)brightnessValueChanged:(id)sender 
{ 
    [brightnessFilter setBrightness:brightnessSlider.value]; 
    [sourcePicture processImage]; 
} 

- (IBAction)contrastValueChanged:(id)sender 
{ 
    [contrastFilter setContrast:contrastSlider.value]; 
    [sourcePicture processImage]; 
} 

все в порядке, пока здесь, так что у меня есть чтобы применить фильтр к изображению

- (IBAction) applyFilterAction:(id)sender 
{ 
    [sourcePicture removeAllTargets]; 

    GPUImageLordKelvinFilter* filterEffect = [[GPUImageLordKelvinFilter alloc] init]; 

    [filterEffect forceProcessingAtSize:imageView.sizeInPixels]; 
    [brightnessFilter forceProcessingAtSize:imageView.sizeInPixels]; 
    [contrastFilter forceProcessingAtSize:imageView.sizeInPixels]; 

    [sourcePicture addTarget:brightnessFilter]; 
    [brightnessFilter addTarget:contrastFilter]; 
    [brightnessFilter addTarget:filterEffect]; 

    [filterEffect addTarget:imageView]; 

    [brightnessFilter setBrightness:brightnessSlider.value]; 
    [contrastFilter setContrast:contrastSlider.value]; 

    [sourcePicture processImage]; 
} 

фильтр применяется правильно, но когда я перемещаю свой слайдер, изображение eView назад к исходному изображению, с изменением контрастности и яркости, но без эффекта фильтра.

, но, если я могу изменить яркость и контрастность в то же время я применить эффект фильтра, яркость или контраст применяется правильно эффект фильтра, например, что-то вроде этого:

// in applyFilterAction: methods 
. 
. 
. 
[filterEffect addTarget:imageView]; 

[brightnessFilter setBrightness:-0.5]; 
[contrastFilter setContrast:2.5]; 

[sourcePicture processImage]; 
. 
. 
. 

Может кто-нибудь дать мне нужна помощь в применении фильтров и изменении их значений, я думаю, что я делаю что-то неправильно с методами addTarget, я искал что-то об этом, но ничего не нашел

ответ

1

Ваш метод -applyFilterAction: разрушает цепочку фильтров представите свой новый фильтр. Если это то, что вы хотите, хорошо, но при этом все становится странно странным.

В исходной цепи вы идете

sourcePicture -> brightnessFilter -> contrastFilter > imageView 

В новой цепи, теперь это

sourcePicture -> brightnessFilter -> filterEffect -> imageView 
            -> contrastFilter > imageView 

Вы ввели разветвление на brightnessFilter, сделав его цель как фильтры filterEffect и contrastFilter , КонтрастФильтр никогда не удалялся из таргетинга на изображение, поэтому он сохраняет таргетинг.

Отправка двух целей на то, что ожидает один вход (например, GPUImageView), может привести к неопределенному поведению. Что-то в этой цепочке ошибочно. Либо вы хотите связать filterEffect после вашего contrastFilter, либо ваш filterEffect и contrastFilter должны ориентироваться на два отдельных GPUImageViews. В первом случае вам нужно будет удалить цель с контрастного фильтра в imageView перед настройкой остальной части цепочки.

Возможно, лучше всего позвонить -removeAllTargets на каждом из фильтров в цепочке, прежде чем сбросить цепь фильтра, чтобы убедиться, что нет никаких оборванных соединений, подобных этому.

+1

Спасибо за ваш ответ @ Брэд Ларсон, я действительно ценю это это мой код теперь applyFilterAction: '[sourcePicture removeAllTargets] ; [яркостьFilter removeAllTargets]; [contrastFilter removeAllTargets]; . . . [sourcePicture addTarget: brightnessFilter]; [яркостьFilter addTarget: contrastFilter]; [contrastFilter addTarget: filterEffect]; ' , но после этого, когда я перемещаю ползунок, яркость и контраст больше не работают. Значения фильтра не изменяются. Знаете ли вы, что происходит? – qwertybunim

+0

Я столкнулся с той же проблемой, могли ли вы запускать ее со статическим изображением и слайдером –

0

попробовать these..i надеюсь, что это поможет вам ..

-(void)viewDidLoad 
{   
[sliderChange setMinimumValue:-0.5]; 
[sliderChange setMaximumValue:0.5]; 
[sliderChange setValue:0.0]; 
brightnessFilter = [[GPUImageBrightnessFilter alloc] init]; 
} 
-(IBAction)upDateSliderValue:(id)sender 
{ 
GPUImagePicture *fx_image; 
fx_image = [[GPUImagePicture alloc] initWithImage:originalImage]; 
[brightnessFilter setBrightness:self.sliderChange.value]; 
[fx_image addTarget:brightnessFilter]; 
[fx_image processImage]; 
UIImage *final_image = [brightnessFilter imageFromCurrentlyProcessedOutput]; 
self.selectedImageView.image = final_image; 
}