Nano Hash - криптовалюты, майнинг, программирование

Размер изображения CIGaussianBlur

Я хочу размыть изображение и использую этот код:

//Get a UIImage from the UIView
NSLog(@"blur capture");
UIGraphicsBeginImageContext(BlurContrainerView.frame.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

//Blur the UIImage
CIImage *imageToBlur = [CIImage imageWithCGImage:viewImage.CGImage];
CIFilter *gaussianBlurFilter = [CIFilter filterWithName: @"CIGaussianBlur"];
[gaussianBlurFilter setValue:imageToBlur forKey: @"inputImage"];
[gaussianBlurFilter setValue:[NSNumber numberWithFloat: 5] forKey: @"inputRadius"]; //change number to increase/decrease blur
CIImage *resultImage = [gaussianBlurFilter valueForKey: @"outputImage"];

//create UIImage from filtered image
blurredImage = [[UIImage alloc] initWithCIImage:resultImage];

//Place the UIImage in a UIImageView
UIImageView *newView = [[UIImageView alloc] initWithFrame:self.view.bounds];
newView.image = blurredImage;

NSLog(@"%f,%f",newView.frame.size.width,newView.frame.size.height);
//insert blur UIImageView below transparent view inside the blur image container
[BlurContrainerView insertSubview:newView belowSubview:transparentView];

И это размывает вид, но не все. Как я могу размыть весь вид?

выставлен счет: postimg.org/image/9bee2e4zx/


Ответы:


1

Проблема не в том, что это не размывает все изображение, а скорее в том, что размытие расширяет границы изображения, делая изображение больше, и в результате оно не выравнивается должным образом.

Чтобы изображение оставалось того же размера, после строки:

CIImage *resultImage    = [gaussianBlurFilter valueForKey: @"outputImage"];

Вы можете взять CGRect для прямоугольника размером с исходное изображение в центре этого resultImage:

// note, adjust rect because blur changed size of image

CGRect rect             = [resultImage extent];
rect.origin.x          += (rect.size.width  - viewImage.size.width ) / 2;
rect.origin.y          += (rect.size.height - viewImage.size.height) / 2;
rect.size               = viewImage.size;

А затем используйте CIContext, чтобы захватить эту часть изображения:

CIContext *context      = [CIContext contextWithOptions:nil];
CGImageRef cgimg        = [context createCGImage:resultImage fromRect:rect];
UIImage   *blurredImage = [UIImage imageWithCGImage:cgimg];
CGImageRelease(cgimg);

В качестве альтернативы для iOS 7, если вы перейдете к пример кода iOS для iOS и загрузите iOS_UIImageEffects.zip, затем выберите категорию UIImage+ImageEffects. Во всяком случае, это дает несколько новых методов:

- (UIImage *)applyLightEffect;
- (UIImage *)applyExtraLightEffect;
- (UIImage *)applyDarkEffect;
- (UIImage *)applyTintEffectWithColor:(UIColor *)tintColor;
- (UIImage *)applyBlurWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor maskImage:(UIImage *)maskImage;

Итак, чтобы размыть, отобразить и осветлить его (придавая эффект «матового стекла»), вы можете сделать:

UIImage *newImage = [image applyLightEffect];

Интересно, что код Apple не использует CIFilter, а вызывает vImageBoxConvolve_ARGB8888 из vImage высокопроизводительная среда обработки изображений. Этот метод проиллюстрирован в видеоролике WWDC 2013 Реализация привлекательного пользовательского интерфейса на iOS.

12.12.2013
  • Привет, Роб! Как дела? Я знаю, что это не ваше основное поле, но у нас есть интересный сценарий, в котором мы хотим уменьшить размер буфера (с точки зрения данных изображения) перед его отображением. Я уверен, что вы получите много запросов, но на всякий случай, если они проскользнут, вот ссылка: stackoverflow.com/questions/57153640/, как всегда - спасибо ты! 24.07.2019

  • 2

    Более быстрое решение - полностью отказаться от CGImageRef и выполнять все преобразования на ленивом уровне CIImage.

    Итак, вместо вашего непригодного:

    // create UIImage from filtered image (but size is wrong)
    blurredImage = [[UIImage alloc] initWithCIImage:resultImage];
    

    Хорошее решение - написать:

    Цель-C

    // cropping rect because blur changed size of image
    CIImage *croppedImage = [resultImage imageByCroppingToRect:imageToBlur.extent];
    // create UIImage from filtered cropped image
    blurredImage = [[UIImage alloc] initWithCIImage:croppedImage];
    

    Swift 3

    // cropping rect because blur changed size of image
    let croppedImage = resultImage.cropping(to: imageToBlur.extent)
    // create UIImage from filtered cropped image
    let blurredImage = UIImage(ciImage: croppedImage)
    

    Swift 4

    // cropping rect because blur changed size of image
    let croppedImage = resultImage.cropped(to: imageToBlur.extent)
    // create UIImage from filtered cropped image
    let blurredImage = UIImage(ciImage: croppedImage)
    
    12.09.2017
  • Спасибо!! Это меня спасло - ›Swift 4 06.06.2018
  • можем ли мы контролировать размытие CIFilter? Мне нужно, чтобы он был более размытым 03.10.2018
  • @AnuranBarman, это другой вопрос. Пожалуйста, разместите это как отдельный вопрос, спасибо. :) 03.10.2018
  • @AnuranBarman в качестве подсказки, вы можете поиграть с inputRadius или переключиться на другой эффект размытия. Если этого недостаточно, вам может потребоваться закодировать эффект размытия. с помощью vImageBoxConvolve_ARGB8888 из Accelerate. 03.10.2018

  • 3

    Похоже, фильтр размытия возвращает вам изображение, которое больше, чем то, с которого вы начали, что имеет смысл, поскольку пиксели по краям становятся размытыми. Самым простым решением, вероятно, было бы newView использовать contentMode из UIViewContentModeCenter, чтобы не пытаться раздавить размытое изображение; вы также можете обрезать blurredImage, нарисовав его в центре нового контекста подходящего размера, но в этом нет необходимости.

    11.12.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..