1

我正在尝试在一个视图中实现亮度、对比度和曝光滤镜,就像您在 iPhoto 应用程序中看到的一样。我试图建立组过滤器来做同样的事情。但它显示的是白屏而不是修改后的图片。这是我应用的代码。

 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];

我什至尝试单独放置每个,但它仍然显示为白色图像。我使用的上述代码是否正确?我也尝试过使用GPUImageFilterPipeline而不是,GPUImageFilterGroup但仍然遇到同样的问题。为了记录,图像是静止图像而不是实时馈送。

4

2 回答 2

5

您错过了一些代码语句,如下所示。

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

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

谢谢

于 2013-08-02T09:21:33.923 回答
0

这是将亮度、对比度和饱和度应用于视频的完整代码

我从 这个链接获得参考代码,我对此进行了更改..

**在此代码中,我们使用 GPUImage 框架

1)。在 .h 文件中

#import "GPUImage.h"

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

2)。在 .m 文件中

- (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);
    }];
}

*注意:- 请在设备而不是模拟器中运行该演示示例以获得完美的结果。

处理完成后,您将在设备中获得受影响的视频,对于不同的效果,您可以更改 setBrightness 、 setContrast 和 setSaturation 的值(参见代码)

于 2014-12-23T07:32:15.680 回答