通过uislider和gpuimage过滤器更改图像的亮度

时间:2014-05-06 14:10:49

标签: ios objective-c gpuimage

我编写了这段代码来通过UISlider和GPUImageBrightnessFilter来改变UIImage的亮度。但每次我测试它时,应用程序都会崩溃。

我的代码:

- (IBAction)sliderBrightness:(id)sender {

    CGFloat midpoint = [(UISlider *)sender value];
    [(GPUImageTiltShiftFilter *)brightnessFilter setTopFocusLevel:midpoint - 0.1];
    [(GPUImageTiltShiftFilter *)brightnessFilter setBottomFocusLevel:midpoint + 0.1];

    [sourcePicture processImage];
}

- (void) brightnessFilter {

    UIImage *inputImage = imgView.image;

    sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES];
    brightnessFilter = [[GPUImageTiltShiftFilter alloc] init];
    //    sepiaFilter = [[GPUImageSobelEdgeDetectionFilter alloc] init];

    GPUImageView *imageView = (GPUImageView *)self.view;
    [brightnessFilter forceProcessingAtSize:imageView.sizeInPixels]; // This is now needed to make the filter run at the smaller output size

    [sourcePicture addTarget:brightnessFilter];
    [brightnessFilter addTarget:imageView];

    [sourcePicture processImage];
}

1 个答案:

答案 0 :(得分:1)

让我提出另一种建筑建议。每次更改亮度时都不是创建GPUImagePicture和GPUImageBrightnessFilter,而是将其作为UIImage保存到UIImageView,重用初始图片并过滤并将其渲染到GPUImageView会更有效。

看看我在GPUImage附带的SimpleImageFilter示例中做了些什么。对于显示在屏幕上的倾斜移位图像,我创建一次源图像的GPUImagePicture,创建一个倾斜移位滤镜实例,然后将输出发送到GPUImageView。这避免了昂贵的(性能和内存方面)进入UIImage然后在UIImageView中显示它的过程,并且会更快,更快。当您使用时,可以在过滤器上使用-forceProcessingAtSize:来仅渲染最终视图中显示的像素数,同时加快速度。

如果您有正确的设置来过滤图像,并且想要最终的UIImage,则可以执行最后一次渲染过程以提取已处理的UIImage。在此之前,您已将强制尺寸设置回0,因此您现在可以处理完整图像。