我在我的应用程序中使用GPUImage,但我在尝试更改图像的亮度和对比度时遇到了困难。
我创建了一个带有源图片的GPUImageView,并设置了将用UISlider修改的亮度滤镜和对比度滤镜
下面是我的代码:
首先
.h
__weak IBOutlet GPUImageView* imageView;.m
GPUImagePicture* sourcePicture;
GPUImageBrightnessFilter *brightnessFilter;
GPUImageContrastFilter *contrastFilter;当我的视图控制器被加载时,我会做下一件事:
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)brightnessValueChanged:(id)sender
{
[brightnessFilter setBrightness:brightnessSlider.value];
[sourcePicture processImage];
}
- (IBAction)contrastValueChanged:(id)sender
{
[contrastFilter setContrast:contrastSlider.value];
[sourcePicture processImage];
}在此之前一切都很好,所以我有一个按钮来对图像应用滤镜
- (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回到原始图像,对比度和亮度正确修改,但没有滤镜效果。
但是,如果我在应用滤镜效果的同时修改亮度或对比度,则会在滤镜效果中正确应用亮度或对比度,例如:
// in applyFilterAction: methods
.
.
.
[filterEffect addTarget:imageView];
[brightnessFilter setBrightness:-0.5];
[contrastFilter setContrast:2.5];
[sourcePicture processImage];
.
.
.有人能给我一些帮助来应用过滤器和修改它们的值吗?我想我在addTarget方法上做了一些错误的事情,我在搜索一些东西,但是什么也找不到
发布于 2015-01-26 23:55:49
您的-applyFilterAction:方法正在打破您的过滤器链来引入您的新过滤器。如果这是你想要的,很好,但这样做会让事情变得有点奇怪。
在你原来的链子里,你去
sourcePicture -> brightnessFilter -> contrastFilter > imageView在新的链条中,这是现在
sourcePicture -> brightnessFilter -> filterEffect -> imageView
-> contrastFilter > imageView您已经在brightnessFilter引入了一个分支,使其同时面向filterEffect和contrastFilter筛选器。contrastFilter从未从目标imageView中删除,所以它一直以此为目标。
将两个目标发送到需要单个输入的对象(如GPUImageView)可能会导致未定义的行为。关于那个链接的一些东西是错误的。要么你想在你的contrastFilter之后链接filterEffect,要么你的filterEffect和contrastFilter需要指向两个独立的GPUImageViews。在前一种情况下,在设置链的其余部分之前,您需要将目标从contrastFilter删除到imageView。
在重置筛选器链之前,最好在链中的每个筛选器上调用-removeAllTargets,以确保没有任何像这样的悬空连接。
发布于 2015-04-02 16:55:18
试试这些..希望它能帮助你..
-(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;
}https://stackoverflow.com/questions/28153182
复制相似问题