2015-04-27 2 views
2

Я использую фильтры GPUImage, чтобы создать простой инструмент регулировки яркости, контраста и насыщенности изображения. Представление имеет один вид изображения и 3 ползунка для каждого фильтра. Сначала я думал, что я буду применять каждый фильтр, поскольку значение каждого из ползунков изменится, но затем я понял, что фильтры должны быть закованы в цепочку. Поэтому я написал код ниже. Проблема с этим кодом заключается в том, что к изображению применяется только фильтр яркости.Применение фильтров GPUImage с UISlider

- (IBAction)brightnessSlider:(UISlider *)sender { 

    brightnessValue = sender.value; 

    UIImage *inputImage = [UIImage imageNamed:@"2.jpg"]; 

    GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage]; 

    GPUImageBrightnessFilter *brightnessFilter = [GPUImageBrightnessFilter new]; 
    GPUImageContrastFilter *contrastFilter = [GPUImageContrastFilter new]; 
    GPUImageSaturationFilter *saturationFilter = [GPUImageSaturationFilter new]; 

    [brightnessFilter setBrightness:brightnessValue]; 
    [contrastFilter setContrast:contrastValue]; 
    [saturationFilter setSaturation:saturationValue]; 

    [stillImageSource addTarget:brightnessFilter]; 
    [brightnessFilter addTarget:contrastFilter]; 
    [contrastFilter addTarget:saturationFilter]; 
    [brightnessFilter useNextFrameForImageCapture]; 
    [stillImageSource processImage]; 

    UIImage *currentFilteredVideoFrame = [brightnessFilter imageFromCurrentFramebuffer]; 

    imageView.image = currentFilteredVideoFrame; 
} 

- (IBAction)contrastSlider:(UISlider *)sender 
{ 
    contrastValue = sender.value; 

    UIImage *inputImage = [UIImage imageNamed:@"2.jpg"]; 

    GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage]; 

    GPUImageBrightnessFilter *brightnessFilter = [GPUImageBrightnessFilter new]; 
    GPUImageContrastFilter *contrastFilter = [GPUImageContrastFilter new]; 
    GPUImageSaturationFilter *saturationFilter = [GPUImageSaturationFilter new]; 

    [brightnessFilter setBrightness:brightnessValue]; 
    [contrastFilter setContrast:contrastValue]; 
    [saturationFilter setSaturation:saturationValue]; 

    [stillImageSource addTarget:brightnessFilter]; 
    [brightnessFilter addTarget:contrastFilter]; 
    [contrastFilter addTarget:saturationFilter]; 
    [brightnessFilter useNextFrameForImageCapture]; 
    [stillImageSource processImage]; 

    UIImage *currentFilteredVideoFrame = [brightnessFilter imageFromCurrentFramebuffer]; 

    imageView.image = currentFilteredVideoFrame; 
} 


- (IBAction)saturationSlider:(UISlider *)sender 
{ 
    saturationValue = sender.value; 

    UIImage *inputImage = [UIImage imageNamed:@"2.jpg"]; 

    GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage]; 

    GPUImageBrightnessFilter *brightnessFilter = [GPUImageBrightnessFilter new]; 
    GPUImageContrastFilter *contrastFilter = [GPUImageContrastFilter new]; 
    GPUImageSaturationFilter *saturationFilter = [GPUImageSaturationFilter new]; 

    [brightnessFilter setBrightness:brightnessValue]; 
    [contrastFilter setContrast:contrastValue]; 
    [saturationFilter setSaturation:saturationValue]; 

    [stillImageSource addTarget:brightnessFilter]; 
    [brightnessFilter addTarget:contrastFilter]; 
    [contrastFilter addTarget:saturationFilter]; 
    [brightnessFilter useNextFrameForImageCapture]; 
    [stillImageSource processImage]; 

    UIImage *currentFilteredVideoFrame = [brightnessFilter imageFromCurrentFramebuffer]; 

    imageView.image = currentFilteredVideoFrame; 


} 

Теперь я решил реализовать все это в гораздо более простой способ, но я не все еще получаю ничего:

UIImage *inputImage = [UIImage imageNamed:@"2.jpg"]; 
    GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage]; 

    //Set Brightness to 60 
    GPUImageBrightnessFilter *brightnessFilter = [GPUImageBrightnessFilter new]; 
    [brightnessFilter setBrightness:60.0]; 

    //Set Contrast to 12 
    GPUImageContrastFilter *contrastFilter = [GPUImageContrastFilter new]; 
    [contrastFilter setContrast:12]; 


    [brightnessFilter addTarget:contrastFilter]; 

    [stillImageSource addTarget:contrastFilter]; 
    [contrastFilter useNextFrameForImageCapture]; 
    [stillImageSource processImage]; 

    UIImage *outputImage1 = [contrastFilter imageFromCurrentFramebuffer]; 
    imageView.image = outputImage1; 
+0

Единственное, что я заметил, что код «[brightnessFilter useNextFrameForImageCapture];» используется во всех трех методах непосредственно перед вызовом processImage ... может ли это быть вашей проблемой? – dean

ответ

1

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

Теперь актуальная проблема. Проверьте GPUImage github issue. Вы вложенные фильтры в следующем порядке:

Still Image> Яркость> Контраст> Насыщенность

И тогда вы получаете изображение с яркостью фильтра. Вы должны получить его через фильтр насыщенности. Таким образом, ваша цепь должна быть как:

Still Image> Яркость> Контраст> Насыщенность> Вывод изображения

+0

ОК, я думаю, что у меня все произошло неправильно, я добавил два фильтра гораздо проще, но я ничего не получил. Я добавил другой код к вопросу. – user3687

+0

Что вы подразумеваете, ничего не получая? Вы работаете с одним фильтром? – Gasim

+0

'[brightFilter addTarget: contrastFilter]; [stillImageSource addTarget: contrastFilter]; 'измените это на' [brightFilter addTarget: contrastFilter]; [stillImageSource addTarget: яркостьFilter]; '. В коде вы добавляете контрастный фильтр как к яркости, так и к неподвижному изображению; в этот момент изменений нет. Вам нужно создать цепочку, чтобы это работало – Gasim

Смежные вопросы