GPUImage灰度和contarstfilter生成内存警告

我正在创build一个将图像转换为二进制图像的应用程序。 为此,我正在使用GPUimage框架。 首先它会将其转换为灰度,而不是改变contarst,而不是将其转换为Binarize图像。

当我使用灰度和对比度filter,它会产生内存警告和一些时间,如果我尝试在一个应用程序崩溃转换多个图像(让我们说10)。

这是我的代码:

- (UIImage *) doBinarize:(UIImage *)sourceImage { UIImage * grayScaledImg = [self grayImage:sourceImage]; grayScaledImg = [self contrastImage:grayScaledImg]; GPUImagePicture *imageSource = [[GPUImagePicture alloc] initWithImage:grayScaledImg]; GPUImageAdaptiveThresholdFilter *stillImageFilter = [[GPUImageAdaptiveThresholdFilter alloc] init]; stillImageFilter.blurRadiusInPixels = 8.0; [imageSource addTarget:stillImageFilter]; [imageSource processImage]; UIImage *retImage = [stillImageFilter imageByFilteringImage:grayScaledImg]; UIImage * aretImage = [self sharpenImage:retImage]; [imageSource removeAllTargets]; return aretImage; } - (UIImage *) grayImage :(UIImage *)inputImage { GPUImageGrayscaleFilter *selectedFilter = [[GPUImageGrayscaleFilter alloc] init]; UIImage *filteredImage = [selectedFilter imageByFilteringImage:inputImage]; return filteredImage; } - (UIImage *) sharpenImage :(UIImage *)inputImage { GPUImageSharpenFilter *sharpenFilter = [[GPUImageSharpenFilter alloc] init]; [sharpenFilter setSharpness:10]; UIImage *quickFilteredImage = [sharpenFilter imageByFilteringImage: inputImage]; return quickFilteredImage; } - (UIImage *) contrastImage :(UIImage *)inputImage { GPUImageContrastFilter *contrastfilter =[[GPUImageContrastFilter alloc]init]; [contrastfilter setContrast:3]; UIImage *ima= [contrastfilter imageByFilteringImage:inputImage]; return ima; } 

如果我closures灰色和对比度内存的代码警告消失,所以问题是在该代码。

首先,你在那里做了很多不必要的工作。 自适应阈值滤波器(连同所有其他边缘检测或阈值滤波器)自动将其input转换为灰度,所以不需要这样做。

你不应该转换UIImage和从UIImage转换,因为每一个通过一个需要在CPU上的昂贵的核心graphics访问。 另外,你将在内存中build立大量的临时UIImage,如果这些内存在循环中累积,这可能是你的内存相关的崩溃的原因。

相反,把你的input图像,并通过你的各种filter一遍:

 GPUImagePicture *imageSource = [[GPUImagePicture alloc] initWithImage:sourceImage]; GPUImageContrastFilter *contrastfilter =[[GPUImageContrastFilter alloc]init]; [contrastfilter setContrast:3]; GPUImageAdaptiveThresholdFilter *stillImageFilter = [[GPUImageAdaptiveThresholdFilter alloc] init]; stillImageFilter.blurRadiusInPixels = 8.0; GPUImageSharpenFilter *sharpenFilter = [[GPUImageSharpenFilter alloc] init]; [sharpenFilter setSharpness:10]; [imageSource addTarget:contrastFilter]; [contrastFilter addTarget:stillImageFilter]; [stillImageFilter addTarget:sharpenFilter]; [sharpenFilter useNextFrameForImageCapture]; [imageSource processImage]; UIImage *outputImage = [sharpenFilter imageFromCurrentFramebuffer]; 

这将导致你的图像保持在GPU上直到最后一步,并且在框架中使用新的framebuffercaching机制,这将限制这个处理的内存使用。