首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GPUImage GroupFilter、Brightness和Contrast iOS

GPUImage GroupFilter、Brightness和Contrast iOS
EN

Stack Overflow用户
提问于 2015-01-26 23:26:23
回答 2查看 1.4K关注 0票数 2

我在我的应用程序中使用GPUImage,但我在尝试更改图像的亮度和对比度时遇到了困难。

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

下面是我的代码:

首先

.h

代码语言:javascript
复制
__weak IBOutlet GPUImageView* imageView;

.m

代码语言:javascript
复制
GPUImagePicture* sourcePicture;
GPUImageBrightnessFilter *brightnessFilter;
GPUImageContrastFilter *contrastFilter;

当我的视图控制器被加载时,我会做下一件事:

代码语言:javascript
复制
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];

下面是改变对比度和亮度值的方法

代码语言:javascript
复制
- (IBAction)brightnessValueChanged:(id)sender
{
    [brightnessFilter setBrightness:brightnessSlider.value];
    [sourcePicture processImage];
}

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

在此之前一切都很好,所以我有一个按钮来对图像应用滤镜

代码语言:javascript
复制
- (IBAction) applyFilterAction:(id)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];
}

滤镜应用正确,但当我移动我的滑块时,imageView回到原始图像,对比度和亮度正确修改,但没有滤镜效果。

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

代码语言:javascript
复制
// in applyFilterAction: methods
.
. 
.
[filterEffect addTarget:imageView];

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

[sourcePicture processImage];
.
.
.

有人能给我一些帮助来应用过滤器和修改它们的值吗?我想我在addTarget方法上做了一些错误的事情,我在搜索一些东西,但是什么也找不到

EN

回答 2

Stack Overflow用户

发布于 2015-01-26 23:55:49

您的-applyFilterAction:方法正在打破您的过滤器链来引入您的新过滤器。如果这是你想要的,很好,但这样做会让事情变得有点奇怪。

在你原来的链子里,你去

代码语言:javascript
复制
sourcePicture -> brightnessFilter -> contrastFilter > imageView

在新的链条中,这是现在

代码语言:javascript
复制
sourcePicture -> brightnessFilter -> filterEffect -> imageView
                                  -> contrastFilter > imageView

您已经在brightnessFilter引入了一个分支,使其同时面向filterEffect和contrastFilter筛选器。contrastFilter从未从目标imageView中删除,所以它一直以此为目标。

将两个目标发送到需要单个输入的对象(如GPUImageView)可能会导致未定义的行为。关于那个链接的一些东西是错误的。要么你想在你的contrastFilter之后链接filterEffect,要么你的filterEffect和contrastFilter需要指向两个独立的GPUImageViews。在前一种情况下,在设置链的其余部分之前,您需要将目标从contrastFilter删除到imageView。

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

票数 1
EN

Stack Overflow用户

发布于 2015-04-02 16:55:18

试试这些..希望它能帮助你..

代码语言:javascript
复制
-(void)viewDidLoad
{        
 [sliderChange setMinimumValue:-0.5];
 [sliderChange setMaximumValue:0.5];
 [sliderChange setValue:0.0];
 brightnessFilter = [[GPUImageBrightnessFilter alloc] init];
}
-(IBAction)upDateSliderValue:(id)sender 
{
 GPUImagePicture *fx_image;
 fx_image = [[GPUImagePicture alloc] initWithImage:originalImage];
 [brightnessFilter setBrightness:self.sliderChange.value];
 [fx_image addTarget:brightnessFilter];
 [fx_image processImage];
 UIImage *final_image = [brightnessFilter imageFromCurrentlyProcessedOutput];
 self.selectedImageView.image = final_image;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28153182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档