ios - 通过 uislider 和 gpuimage 过滤器改变图像的亮度

标签 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];
}

最佳答案

让我提出一个替代架构建议。与其在每次更改亮度时创建 GPUImagePicture 和 GPUImageBrightnessFilter,然后将其作为 UIImage 保存到 UIImageView,不如重用初始图片和过滤器并将其渲染到 GPUImageView 会更有效。

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

当您有正确的图像过滤设置,并且想要输出最终的 UIImage 时,您可以执行最后一次渲染过程以提取处理后的 UIImage。在执行此操作之前,您会将强制大小设置回 0,因此您现在可以处理完整图像。

关于ios - 通过 uislider 和 gpuimage 过滤器改变图像的亮度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23497145/

相关文章:

ios - 需要帮助来设置自动版式

ios - 如何在 UITable 中实现 Instagram 评论的效果?

ios - 无法在 objective-c 中创建正则表达式

ios - 对视频文件应用滤镜

ios - GPUImage锁定 View

ios - GPUImage 多个实时视频

ios - 项目上有白色背景的 UIDatePicker

ios - 如何使用 xmpp openfire 发送打字通知

objective-c - Dealloc 未被调用

objective-c - cocos2d 支持 ARC 吗?