gpt4 book ai didi

ios - GPUImage 灰度和对比度过滤器生成内存警告

转载 作者:行者123 更新时间:2023-11-28 18:33:35 26 4
gpt4 key购买 nike

我正在创建一个将图像转换为二进制图像的应用程序。为此,我正在使用 GPUimage 框架。首先,它会将其转换为灰度,然后更改对比度,然后将其转换为二值化图像。

当我使用灰度和对比度滤镜时,它会生成内存警告,有时如果我尝试转换多个图像(比如 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;
}

如果我关闭灰色代码并且对比内存警告消失,那么问题出在该代码中。

最佳答案

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

您不应该在 UIImage 之间进行转换,因为每次通过 UIImage 都需要在 CPU 上进行昂贵的 Core Graphics 访问。此外,您将在内存中构建大量巨大的临时 UIImage,如果它们在循环中累积,这可能会导致与内存相关的崩溃。

取而代之的是,将您的输入图像一次链接到您的各种过滤器:

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 上,并且借助框架中新的帧缓冲区缓存机制,它将限制此处理的内存使用量。

关于ios - GPUImage 灰度和对比度过滤器生成内存警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23406403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com