【问题标题】:iOS CIFilter of RAW Image Memory Issue (Objective-C)iOS CIFilter RAW 图像内存问题(Objective-C)
【发布时间】:2020-02-26 02:53:07
【问题描述】:

我正在将 CIFilter 应用于 RAW 图像,但是当我尝试在 UIImageView 中显示它时遇到一些内存问题。
我使用以下代码应用 CIFilter:

CIFilter *rawshadow = [CIFilter filterWithImageURL:initialImageUrl options:@{kCIInputBoostShadowAmountKey: [NSNumber numberWithFloat:self.shadowsSlider.value],kCIInputScaleFactorKey: [NSNumber numberWithFloat:1]}];
currentImage = rawshadow.outputImage;

然后我使用以下内容更新 UIImageView:

-(void) UpdatePreview{
    CIContext *context = [CIContext contextWithOptions:@{kCIContextCacheIntermediates: [NSNumber numberWithBool:NO], kCIContextPriorityRequestLow:[NSNumber numberWithBool:YES]}];
    CGImageRef cgImage = [context createCGImage:currentImage fromRect:[currentImage extent]];
    UIImage* img = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);
    [self.mainImageView setImage:img];
}

运行 UpdatePreview 后,RAM 飙升至 2GB 并崩溃。 我使用的原始图像是 6000x4000,大约 24MB。
是不是太大了还是我遗漏了什么?
提前感谢您的帮助。

【问题讨论】:

    标签: ios objective-c core-image


    【解决方案1】:

    即使您没有使用 CIFilter,为图像视图分配比显示所需更大的图像总是是错误的。您的图像视图不是 6000x4000,因此您的图像不应该是。事实上,你的图像不是 6000x4000:它是 12000x8000,甚至是 18000x12000,因为你错误地从 CGImage 转换为 UIImage(你使用的是 1 的隐式 scale,而不是将scale 设置为您的屏幕分辨率)。难怪你会崩溃。

    按照需要的尺寸处理原始图像,或者将图像尺寸缩小为过滤器链的一部分,以便输出图像是在您的界面中显示实际需要的尺寸。 (而且在去UIImage的路上不需要经过CGImage;你可以直接从CIImage渲染到UIImage。)

    【讨论】:

    • 好的,对图像进行小比例处理以进行显示。但是假设我需要将完整版本保存到相机胶卷,应用程序仍然崩溃。我该如何解决这个问题?
    • 抱歉,您是说我的回答确实解决了您最初提出的问题吗?
    • 解决了显示的问题,但是无法全尺寸保存。
    • 也许 iOS 无法做到这一点?但也许这取决于你如何储蓄。尝试调试以确定崩溃发生的确切时间。然后我建议你问一个新问题,显示新的保存代码和崩溃点以及崩溃日志的内容,让我们尝试在那里处理它。谢谢!
    • 例如,如果您的计划是从 CIFilter 的输出图像直接保存到磁盘,则根本不应该制作 UIImage;只需调用 CIContext 的writeJPEGRepresentation (developer.apple.com/documentation/coreimage/cicontext/…) 即可将 CIImage 作为图像数据直接保存到磁盘。这样一来,完整的图像数据就不会成为应用内存的一部分。
    猜你喜欢
    • 2020-03-20
    • 2015-12-09
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多