2015-04-27 49 views
2

我使用GPUImage過濾器來創建一個簡單的圖像亮度,對比度和飽和度調整工具。視圖有一個圖像視圖,每個過濾器有三個滑塊。起初我以爲我會應用每個過濾器作爲每個滑塊的價值改變,但後來我意識到,過濾器必須鏈接。所以我寫了下面的代碼。這個代碼的問題是隻有亮度過濾器應用於圖像。應用與UISlider GPUImage過濾器

- (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。你已經按以下順序嵌套過濾器:

靜止圖像>亮度>對比度>飽和度

然後,你都可以從亮度過濾圖像。你需要通過飽和度過濾器。所以,你的鏈條需要像:

靜止圖像>亮度>對比度>飽和度>輸出圖像

+0

好吧,我認爲我的整個事情都錯了,我以一種更簡單的方式添加了兩個過濾器,但我什麼都沒有。我將其他代碼添加到問題中。 – user3687

+0

什麼意思?你得到一個單一的過濾器工作? – Gasim

+0

'[brightnessFilter addTarget:contrastFilter]; [stillImageSource addTarget:contrastFilter];'將其更改爲'[brightnessFilter addTarget:contrastFilter]; [stillImageSource addTarget:brightnessFilter];'。在你的代碼中,你正在爲亮度和靜止圖像添加對比度濾鏡;這一刻沒有變化。您需要製作一個鏈條才能使其工作 – Gasim

相關問題