Nareshkumar
Nareshkumar

Reputation: 2351

GPUImage group filters

I am trying to implement brightness,contrast and exposure filters in a single view same as you see in iPhoto app. I have tried to put up group filter for doing the same. But it shows up a white screen instead of modified picture. Here is the code I applied.

 GPUImageFilterGroup *groupFilter = [[GPUImageFilterGroup alloc]init];
    GPUImageBrightnessFilter *brightnessFilter = [[GPUImageBrightnessFilter alloc]init];
    [brightnessFilter setBrightness:brightnessValue];
    GPUImageContrastFilter *contrastFilter = [[GPUImageContrastFilter alloc]init];
    [contrastFilter setContrast:contrastValue];
    GPUImageExposureFilter *exposureFilter =[[GPUImageExposureFilter alloc]init];
    [exposureFilter setExposure:exposureValue];
    [groupFilter addFilter:brightnessFilter];
    [groupFilter addFilter:contrastFilter];
    [groupFilter addFilter:exposureFilter];
     GPUImagePicture *stillImage= [[GPUImagePicture alloc]initWithImage:self.imageToModify];
    [stillImage addTarget:groupFilter];


    [stillImage processImage];

    previewPicture.image = [groupFilter imageFromCurrentlyProcessedOutputWithOrientation:self.imageToModify.imageOrientation];

I even tried to put each individually but still it shows up white image. Is the above code I am using correct? I have also tried using GPUImageFilterPipeline instead of GPUImageFilterGroup but still having the same issue. For the record, the image is a still image and not live feed.

Upvotes: 1

Views: 4828

Answers (2)

Hardik Thakkar
Hardik Thakkar

Reputation: 15951

Here is a full code to apply Brightness, Contrast and Saturation to video

i get the reference code from this link and i make change in that..

** in this code we use GPUImage Frameworks

1). in .h file

#import "GPUImage.h"

@interface ViewController : UIViewController
{
    GPUImageMovie *movieFile;
    GPUImageMovieWriter *movieWriter;
    GPUImageUIElement *uiElementInput;
}

2). in .m file

- (void)editVideo
{
    NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"Sample Video" withExtension:@"m4v"];

    movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL];
    movieFile.runBenchmark = YES;
    movieFile.playAtActualSpeed = YES;

    GPUImageFilterGroup *groupFilter = [[GPUImageFilterGroup alloc]init]; //1

    GPUImageBrightnessFilter *brightnessFilter = [[GPUImageBrightnessFilter alloc] init]; //2
    GPUImageContrastFilter *contrastFilter = [[GPUImageContrastFilter alloc] init]; //3
    GPUImageSaturationFilter *saturationFilter = [[GPUImageSaturationFilter alloc] init]; //4

    [(GPUImageBrightnessFilter*)brightnessFilter setBrightness:0.10]; // change value between -1.00 to 1.00
    [(GPUImageContrastFilter*)contrastFilter setContrast:1.48];     // change value between 0.00 to 4.00
    [(GPUImageSaturationFilter*)saturationFilter setSaturation:2.00];   //change value between 0.00 to 2.00

    GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; //5
    blendFilter.mix = 0.0;

                                                            /* ************************************************** */

    UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height-20)];
    contentView.backgroundColor = [UIColor clearColor];

    uiElementInput = [[GPUImageUIElement alloc] initWithView:contentView];
    [brightnessFilter addTarget:contrastFilter];
    [contrastFilter addTarget:saturationFilter];
    [saturationFilter addTarget:blendFilter];
    [uiElementInput addTarget:blendFilter];

    [(GPUImageFilterGroup *) groupFilter setInitialFilters:[NSArray arrayWithObject: brightnessFilter]];
    [(GPUImageFilterGroup *) groupFilter setTerminalFilter:blendFilter];

    [movieFile addTarget:brightnessFilter];
    [movieFile addTarget:contrastFilter];
    [movieFile addTarget:saturationFilter];

    // Only rotate the video for display, leave orientation the same for recording
    GPUImageView *filterView = (GPUImageView *)vwVideo;
    [brightnessFilter addTarget:filterView];
    [contrastFilter addTarget:filterView];
    [saturationFilter addTarget:filterView];
    [blendFilter addTarget:filterView];

    [brightnessFilter setFrameProcessingCompletionBlock:^(GPUImageOutput * filter, CMTime frameTime){
        if (frameTime.value/frameTime.timescale == 2) {
            [contentView viewWithTag:1].hidden = NO;
        }
        [uiElementInput update];
    }];

    [contrastFilter setFrameProcessingCompletionBlock:^(GPUImageOutput * filter, CMTime frameTime){
        if (frameTime.value/frameTime.timescale == 2) {
            [contentView viewWithTag:1].hidden = NO;
        }
        [uiElementInput update];
    }];

    [saturationFilter setFrameProcessingCompletionBlock:^(GPUImageOutput * filter, CMTime frameTime){
        if (frameTime.value/frameTime.timescale == 2) {
            [contentView viewWithTag:1].hidden = NO;
        }
        [uiElementInput update];
    }];

    //In addition to displaying to the screen, write out a processed version of the movie to disk
    NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];
    unlink([pathToMovie UTF8String]); // If a file already exists, AVAssetWriter won't let you record new frames, so delete the old movie

    movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:[NSURL fileURLWithPath:pathToMovie] size:CGSizeMake(640.0, 480.0)];
    [brightnessFilter addTarget:movieWriter];
    [contrastFilter addTarget:movieWriter];
    [blendFilter addTarget:movieWriter];

    // Configure this for video from the movie file, where we want to preserve all video frames and audio samples
    movieWriter.shouldPassthroughAudio = YES;
    movieFile.audioEncodingTarget = movieWriter;
    [movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter];

    [movieWriter startRecording];
    [movieFile startProcessing];

    [movieWriter setCompletionBlock:^{
        UISaveVideoAtPathToSavedPhotosAlbum(pathToMovie, nil, nil, nil);
    }];
}

*Note :- Please run that demo example in device not in simulator for perfect result.

After process done you will get effected video in your device and for different effect you can change the value at setBrightness , setContrast and setSaturation (see in code)

Upvotes: 0

Hindu
Hindu

Reputation: 2914

you have missed some code statement for doing it which is as below.

   [brightnessFilter addTarget: contrastFilter];
   [contrastFilter addTarget: exposureFilter];

  [(GPUImageFilterGroup *) groupFilter setInitialFilters:[NSArray arrayWithObject: brightnessFilter]];
  [(GPUImageFilterGroup *) groupFilter setTerminalFilter:exposureFilter];

Thanks

Upvotes: 5

Related Questions