Reputation: 804
I'm using GPUImage filters to create a simple image brightness,contrast and saturation adjustment tool. The view has one image view and 3 sliders for each filter. At first i thought i would apply each filter as the value of each of the sliders change but then i realized that the filters had to be chained. So i wrote the code below. The problem with this code is that only the brightness filter is applied to the image.
- (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;
}
Now i decided to implement the whole thing in a much simpler way but i am still getting nothing:
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;
Upvotes: 2
Views: 1403
Reputation: 7961
You don't need to use the same add target codes for each slider change. you should only change the values of the needed filter and setup all the filters somewhere else in the code; where you will eventually load the image. This will make your code much easier to maintain and will make this question shorter.
Now to the actual problem. Check out GPUImage github issue. You have nested the filters in the following order:
Still Image > Brightness > Contrast > Saturation
And then you are getting the image from Brightness filter. You need to get it through Saturation filter. So, your chain needs to be like:
Still Image > Brightness > Contrast > Saturation > Output Image
Upvotes: 1