OStack程序员社区-中国程序员成长平台

标题: ios - GPUImage GroupFilter,亮度和对比度 iOS [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 05:00
标题: ios - GPUImage GroupFilter,亮度和对比度 iOS

我在我的应用中使用 GPUImage,但我一直在尝试更改图像的亮度和对比度。

我用源图片创建了一个GPUImageView,并设置了将使用UISlider修改的亮度滤镜和对比度滤镜

这是我的代码:

首先

.h

__weak IBOutlet GPUImageView* imageView;

.m

GPUImagePicture* sourcePicture;
GPUImageBrightnessFilter *brightnessFilter;
GPUImageContrastFilter *contrastFilter;

当我的 View Controller 被加载时,我会做下一件事:

UIImage* image = "[image fromAnotherViewController]";
sourcePicture = [[GPUImagePicture alloc] initWithImage:image smoothlyScaleOutput:YES];

brightnessFilter = [[GPUImageBrightnessFilter alloc] init];
contrastFilter = [[GPUImageContrastFilter alloc] init];

[brightnessFilter forceProcessingAtSize:imageView.sizeInPixels];
[contrastFilter forceProcessingAtSize:imageView.sizeInPixels];

[sourcePicture addTarget:brightnessFilter];
[brightnessFilter addTarget:contrastFilter];

[contrastFilter addTarget:imageViewBewo];

[sourcePicture processImage];

这是对比度和亮度值更改方法

- (IBAction)brightnessValueChangedid)sender
{
    [brightnessFilter setBrightness:brightnessSlider.value];
    [sourcePicture processImage];
}

- (IBAction)contrastValueChangedid)sender
{
    [contrastFilter setContrast:contrastSlider.value];
    [sourcePicture processImage];
}

到这里为止一切正常,所以我有一个按钮可以对图像应用过滤器

- (IBAction) applyFilterActionid)sender
{
    [sourcePicture removeAllTargets];

    GPUImageLordKelvinFilter* filterEffect = [[GPUImageLordKelvinFilter alloc] init];

    [filterEffect forceProcessingAtSize:imageView.sizeInPixels];
    [brightnessFilter forceProcessingAtSize:imageView.sizeInPixels];
    [contrastFilter forceProcessingAtSize:imageView.sizeInPixels];

    [sourcePicture addTarget:brightnessFilter];
    [brightnessFilter addTarget:contrastFilter];
    [brightnessFilter addTarget:filterEffect];

    [filterEffect addTarget:imageView];

    [brightnessFilter setBrightness:brightnessSlider.value];
    [contrastFilter setContrast:contrastSlider.value];

    [sourcePicture processImage];
}

过滤器应用正确,但是当我移动 slider 时,imageView 回到原始图像,正确修改了对比度和亮度,但没有过滤器效果。

但是,如果我在应用滤镜效果的同时修改亮度或对比度,则亮度或对比度会正确应用在滤镜效果中,例如:

// in applyFilterAction: methods
.
. 
.
[filterEffect addTarget:imageView];

[brightnessFilter setBrightness:-0.5];
[contrastFilter setContrast:2.5];

[sourcePicture processImage];
.
.
.

谁能给我任何帮助来应用过滤器和修改它们的值,我认为我在使用 addTarget 方法时做错了,我正在搜索相关内容,但一无所获



Best Answer-推荐答案


您的 -applyFilterAction: 方法正在破坏您的过滤器链以引入您的新过滤器。如果这就是你想要的,那很好,但这样做会有点奇怪。

在你原来的链中你去

sourcePicture -> brightnessFilter -> contrastFilter > imageView

在新链中,这是现在

sourcePicture -> brightnessFilter -> filterEffect -> imageView
                                  -> contrastFilter > imageView

您已通过使其同时针对 filterEffect 和 contrastFilter 过滤器来在亮度过滤器处引入分支。 contrastFilter 从未从定位 imageView 中删除,因此它一直定位它。

将两个目标发送到需要单个输入的东西(如 GPUImageView)可能会导致未定义的行为。关于该链接的某些内容是错误的。您的意思是在您的 contrastFilter 之后链接 filterEffect,或者您的 filterEffect 和 contrastFilter 需要针对两个单独的 GPUImageView。在前一种情况下,您需要先将目标从 contrastFilter 删除到 imageView,然后再设置链的其余部分。

在重置过滤器链之前,最好在链中的每个过滤器上调用 -removeAllTargets,以确保没有任何像这样的悬空连接。 p>

关于ios - GPUImage GroupFilter,亮度和对比度 iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28153182/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4