我正在使用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
答案 0 :(得分:1)
如果你正在做的只是将图像显示在屏幕上,请在链中的第一个过滤器上使用-forceProcessingAtSize:
。对于大输入图像,这将大大减少它们在内存中的大小。
另外,不要同时加载相同的图像,一次是UIImageView,一次是GPUImagePicture。相反,我建议通过添加GPUImageView作为GPUImagePicture的并行目标来删除UIImageView并将未过滤的图像版本显示到GPUImageView。这样可以节省大量的内存以获得大图片。
最后,您将在ARC下使用上述代码崩溃,因为您并未在任何地方坚持使用GPUImagePicture。您需要将GPUImagePicture设置为类的实例变量或属性,否则将在上述方法完成后立即取消分配。如果您不使用ARC,则会在上面的所有地方泄漏内存(这可能是您问题的一部分)。
答案 1 :(得分:0)
如果您使用的是旧版GPUImageView,请使用
[filter prepareForImageCapture]
或者如果您使用的是新版本,请使用
[stillImageFilter useNextFrameForImageCapture];
在
之上添加此方法[imagePic processImage];
这是您代码的最后一行。
试试这个,可以帮到你