iOS CIF-фильтр из памяти изображений RAW (Цель- C) - PullRequest
0 голосов
/ 25 февраля 2020

Я применяю 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 объем оперативной памяти увеличивается до 2 ГБ и вылетает , Я использую необработанное изображение размером 6000x4000 и размером около 24 МБ. Это слишком большой или я что-то упустил? Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 25 февраля 2020

Даже если вы не использовали CIFilter, всегда неправильно назначать просмотру изображения изображение больше, чем необходимо для отображения. Ваш просмотр изображения не 6000x4000, поэтому ваше изображение не должно быть. И действительно, ваше изображение не 6000x4000: это 12000x8000 или даже 18000x12000, потому что вы неправильно конвертируете из CGImage в UIImage (вы используете неявное scale из 1, а не установку scale к разрешению вашего экрана). Неудивительно, что у вас происходит сбой.

Обработайте исходное изображение до необходимого размера или уменьшите размер изображения как часть цепочки фильтров, чтобы выходное изображение соответствовало размеру, необходимому для отображения в вашем интерфейсе. (И нет необходимости проходить через CGImage на пути к UIImage; вы можете выполнить рендеринг непосредственно из CIImage в UIImage.)

...