如何减lessGPUImageGaussianSelectBlurFilter效果中的内存消耗?

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

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

如果processImage方法没有被调用,内存消耗会减less很多,那么如何用另一个方法来replace呢?

如何减less内存消耗?

 #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 

如果您所做的只是将图像显示在屏幕上,请在链中的第一个filter上使用-forceProcessingAtSize: 对于大的input图像,这将大大减less它们在内存中的大小。

此外,不要加载相同的图像两次,一次为您的UIImageView和一次为您的GPUImagePicture。 相反,我build议删除UIImageView,并通过将GPUImageView作为GPUImagePicture的并行目标添加到GPUImageView,将图像的未过滤版本显示出来。 这将为大量图片节省大量的内存。

最后,你将在ARC下的上面的代码崩溃,因为你没有坚持到你的GPUImagePicture任何地方。 您需要将您的GPUImagePicture设置为您的类的实例variables或属性,否则将在上述方法完成时立即解除分配。 如果你没有使用ARC,那么你在上面的内存泄漏(这可能是你的问题的一部分)。

如果您使用旧版本的GPUImageView,则使用

 [filter prepareForImageCapture] 

或者如果你正在使用新版本,然后使用

 [stillImageFilter useNextFrameForImageCapture]; 

在上面添加这个方法

 [imagePic processImage]; 

这是你的代码的最后一行。

试试这个,可以帮助你