如何在GPUImageGaussianSelectiveBlurFilter效果中减少内存消耗?

时间:2014-07-30 03:36:36

标签: ios gpuimage

我正在使用GPUImage框架实施GPUImageGaussianSelectiveBlurFilter效果。

现在已经实现GPUImageGaussianSelectiveBlurFilter效果,但内存消耗太多。我知道通过forceProcessingAtSize方法可以减少一些内存消耗,但减少内存消耗太少。

如果没有调用processImage方法,内存消耗会减少很多,那么如何使用其他方法来替换呢?

如何减少内存消耗?

#import "ViewController.h"
#import "GPUImage.h"
@interface ViewController ()
{
  UIImageView *captureImageView;
  UIScrollView *scrollView;
  GPUImageView *imageViewGpu;
  GPUImageGaussianSelectiveBlurFilter *filter;
  BOOL filterFalg;
}
@end

@implementation ViewController

-(void)viewDidLoad
{

[super viewDidLoad];
self.view.backgroundColor = [UIColor clearColor];

// create scrollView
scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame];
[self.view addSubview:scrollView];
scrollView.minimumZoomScale = 1.0;
scrollView.maximumZoomScale = 3.0;
scrollView.delegate = self;
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
scrollView.contentSize = CGSizeMake(self.view.frame.size.width, self.view.frame.size.height);
scrollView.bounces = NO;

// create imageView
captureImageView = [[UIImageView alloc] init];
captureImageView.frame = self.view.frame;
captureImageView.image = [UIImage imageNamed:@"image.jpg"];

// add filter to imagePic
GPUImagePicture *imagePic = [[GPUImagePicture alloc] initWithImage:captureImageView.image smoothlyScaleOutput:YES];
filter = [[GPUImageGaussianSelectiveBlurFilter alloc] init];
[imagePic addTarget:filter];

// create GPUImageView
imageViewGpu = [[GPUImageView alloc] initWithFrame:self.view.frame];
imageViewGpu.userInteractionEnabled = YES;
imageViewGpu.multipleTouchEnabled = YES;
imageViewGpu.backgroundColor = [UIColor clearColor];
imageViewGpu.fillMode = kGPUImageFillModePreserveAspectRatio;
[scrollView addSubview:imageViewGpu];


if (imageViewGpu.frame.size.height>imageViewGpu.frame.size.width) {
    [filter setAspectRatio:imageViewGpu.frame.size.height/imageViewGpu.frame.size.width];
}
else
{
    [filter setAspectRatio:imageViewGpu.frame.size.width/imageViewGpu.frame.size.height];
}


[filter setExcludeCircleRadius:0.0f];
[filter setExcludeCirclePoint:CGPointMake(0.5f, 0.5f)];
[filter setBlurRadiusInPixels:10];
[filter addTarget:imageViewGpu];

[imagePic processImage];

}  

 @end

2 个答案:

答案 0 :(得分:1)

如果你正在做的只是将图像显示在屏幕上,请在链中的第一个过滤器上使用-forceProcessingAtSize:。对于大输入图像,这将大大减少它们在内存中的大小。

另外,不要同时加载相同的图像,一次是UIImageView,一次是GPUImagePicture。相反,我建议通过添加GPUImageView作为GPUImagePicture的并行目标来删除UIImageView并将未过滤的图像版本显示到GPUImageView。这样可以节省大量的内存以获得大图片。

最后,您将在ARC下使用上述代码崩溃,因为您并未在任何地方坚持使用GPUImagePicture。您需要将GPUImagePicture设置为类的实例变量或属性,否则将在上述方法完成后立即取消分配。如果您不使用ARC,则会在上面的所有地方泄漏内存(这可能是您问题的一部分)。

答案 1 :(得分:0)

如果您使用的是旧版GPUImageView,请使用

[filter prepareForImageCapture]

或者如果您使用的是新版本,请使用

[stillImageFilter useNextFrameForImageCapture];

之上添加此方法
[imagePic processImage];

这是您代码的最后一行。

试试这个,可以帮到你