【发布时间】:2014-07-03 19:59:17
【问题描述】:
我已经实现了一个用于图像编辑的组过滤器(GPUImageSepiaFilter、GPUImageExposureFilter、GPUImageSepiaFilter)。我有一个用于设置自定义“曝光”(setExposure:) 值的滑块。在滑块的“didValueChanged”操作方法上,我通过调用“图片processImage”来刷新图像预览。如果我快速移动滑块或反复滚动滑块时,应用程序肯定会由于内存问题而崩溃。
- (void)viewDidLoad {
[super viewDidLoad];
self.originalPicture = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"IMG_0009.JPG"]];
self.filterGroup = [[GPUImageFilterGroup alloc] init];
GPUImageSepiaFilter *sepiaFilter = [[GPUImageSepiaFilter alloc] init];
[self.filterGroup addFilter:sepiaFilter];
GPUImageExposureFilter *pixellateFilter = [[GPUImageExposureFilter alloc] init];
[pixellateFilter setExposure:0.0f];
[self.filterGroup addFilter:pixellateFilter];
GPUImageSaturationFilter *saturation = [[GPUImageSaturationFilter alloc] init];
[self.filterGroup addFilter:saturation];
[sepiaFilter addTarget:pixellateFilter];
[pixellateFilter addTarget:saturation];
[self.filterGroup setInitialFilters:[NSArray arrayWithObjects:sepiaFilter, pixellateFilter,nil]];
[self.filterGroup setTerminalFilter:saturation];
[self.originalPicture addTarget:self.filterGroup];
GPUImageView *filterView = [[GPUImageView alloc] init];
self.view = filterView;
[self.filterGroup addTarget:filterView];
[self.originalPicture processImage];
[self.slider setMinimumTrackTintColor:[UIColor redColor]];
[self.slider setMaximumTrackTintColor:[UIColor greenColor]];
[self.view addSubview:self.slider];
}
- (IBAction)didChangeValue:(id)sender {
GPUImageExposureFilter *filter = (GPUImageExposureFilter *)[self.filterGroup filterAtIndex:1];
[filter setExposure:self.slider.value];
[self.originalPicture processImage];
}
解决此问题的最佳方法是什么?还是我做错了什么?
谢谢,
斯里尼瓦斯
【问题讨论】:
-
图片的像素大小?
-
@Andrea:图像大小应为 743KB 到 2.5MB。
-
以像素为单位的大小,而不是字节... ;-) 它可以在图像处理中产生很大的不同。在内存中解压的图像是 heightwidthn°channel*n°bit_for_each_channel
-
@Andrea,很抱歉。它的大小为 2000x1333。
-
@Srinivas - 每个帧缓冲区有 10.7 MB 的未压缩内存(其中至少有两个)。尝试在您的第一个过滤器上使用
-forceProcessingAtSize:以将其大小减小到目标视图的像素大小。这将显着减少内存消耗,并且还将真正加快此处的处理速度。
标签: ios memory-management gpuimage gpuimagestillcamera