2013-12-13 3 views
0

Мне нужен совет по эффективному использованию CIFilter в памяти. В принципе, я соединяю два фильтра вместе. Сложная часть - мне нужно сначала преобразовать UIImage в CIImage, прежде чем вызывать фильтры. Код размещен ниже:CIFilters вызвало приложение к сбою

CIImage *foreground = [CIImage imageWithCGImage:first.CGImage options:nil]; 
CIImage *background = [CIImage imageWithCGImage:second.CGImage options:nil]; 

CIFilter *softLightBlendFilter = [CIFilter filterWithName:@"CISoftLightBlendMode"]; 
[softLightBlendFilter setDefaults]; 
[softLightBlendFilter setValue:foreground forKey:kCIInputImageKey]; 
[softLightBlendFilter setValue:background forKey:kCIInputBackgroundImageKey]; 

CIImage *result = [softLightBlendFilter outputImage]; 

foreground = nil; 
background = nil; 
softLightBlendFilter = nil; 

CIFilter *gammaAdjustFilter = [CIFilter filterWithName:@"CIGammaAdjust"]; 
[gammaAdjustFilter setDefaults]; 
[gammaAdjustFilter setValue:result forKey:kCIInputImageKey]; 
[gammaAdjustFilter setValue:[NSNumber numberWithFloat:value] forKey:@"inputPower"]; 
result = [gammaAdjustFilter valueForKey:kCIOutputImageKey]; 

gammaAdjustFilter = nil; 

CIContext *context = [CIContext contextWithOptions:nil]; 
CGRect extent = [result extent]; 
CGImageRef cgImage = [context createCGImage:result fromRect:extent]; 

UIImage *image = [UIImage imageWithCGImage:cgImage scale:1.0 orientation:first.imageOrientation]; 

CFRelease(cgImage); 
result = nil; 

return image; 

И этот код легко снимает память до 200Мб, что вызовет приложение к краху.

Так что я делаю неправильно? Как я могу это исправить?

ответ

1

Вызов изображения.CGImage загружает изображение в память.

Вы можете попробовать использовать

CIImage *ciImage = [CIImage imageWithContentsOfURL:imageUrl options:@{kCIImageColorSpace:[NSNull null]}]; 

CIImage * ciImage = [CIImage imageWithCGImage: опции first.CGImage: ноль];

вместо

CIImage *ciImage = [CIImage imageWithCGImage:uiImage.CGImage options:nil]; 

Another вариантов замостить изображения, применять фильтры на плитку, а затем сшить их вместе снова ..

+0

Спасибо PEKO, загрузка изображения из файла URL вместо image.CGImage значительно уменьшил площадь памяти. Мне интересно, что здесь творится, не загрузил ли образ данных imageWithContentOfURL? –

+0

Привет, peko, у меня все еще такая же проблема на iPhone 4S, строка: CIImage * foreground = [CIImage imageWithContentsOfURL: [NSURL fileURLWithPath: first] options: nil]; мгновенно дает мне предупреждение о памяти и приводит к сбою приложения ... –

Смежные вопросы