我编写此代码是为了通过 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/