Каков наилучший фильтр Core Image для получения черно-белых эффектов?

Я использую Core Image и хотел бы получить черно-белый эффект на выбранном изображении.

В идеале я хотел бы иметь доступ к тем же параметрам, которые доступны в Photoshop, например, Reds, Cyan, Greens, Blues и Magenta. objectiveю является создание различных типов черно-белого эффекта.

Кто-нибудь знает, какой фильтр лучше всего будет манипулировать этими параметрами? Если никто не знает о хорошем подходе к созданию черно-белого эффекта с использованием других фильтров?

благодаря

Оливер

- (UIImage *)imageBlackAndWhite { CIImage *beginImage = [CIImage imageWithCGImage:self.CGImage]; CIImage *blackAndWhite = [CIFilter filterWithName:@"CIColorControls" keysAndValues:kCIInputImageKey, beginImage, @"inputBrightness", [NSNumber numberWithFloat:0.0], @"inputContrast", [NSNumber numberWithFloat:1.1], @"inputSaturation", [NSNumber numberWithFloat:0.0], nil].outputImage; CIImage *output = [CIFilter filterWithName:@"CIExposureAdjust" keysAndValues:kCIInputImageKey, blackAndWhite, @"inputEV", [NSNumber numberWithFloat:0.7], nil].outputImage; CIContext *context = [CIContext contextWithOptions:nil]; CGImageRef cgiimage = [context createCGImage:output fromRect:output.extent]; //UIImage *newImage = [UIImage imageWithCGImage:cgiimage]; UIImage *newImage = [UIImage imageWithCGImage:cgiimage scale:image.scale orientation:image.imageOrientation]; CGImageRelease(cgiimage); return newImage; } 

Обновление: для iOS6 есть фильтр CIColorMonochrome , но я играл с ним и нашел его не очень хорошим, как мой.

вот пример с CIColorMonochrome

 - (UIImage *)imageBlackAndWhite { CIImage *beginImage = [CIImage imageWithCGImage:self.CGImage]; CIImage *output = [CIFilter filterWithName:@"CIColorMonochrome" keysAndValues:kCIInputImageKey, beginImage, @"inputIntensity", [NSNumber numberWithFloat:1.0], @"inputColor", [[CIColor alloc] initWithColor:[UIColor whiteColor]], nil].outputImage; CIContext *context = [CIContext contextWithOptions:nil]; CGImageRef cgiimage = [context createCGImage:output fromRect:output.extent]; UIImage *newImage = [UIImage imageWithCGImage:cgiimage scale:self.scale orientation:self.imageOrientation]; CGImageRelease(cgiimage); return newImage; } 

Чтобы создать чистый monoхромный эффект, я использовал CIColorMatrix с параметрами вектора R, G и B, которые были установлены на (0.2125, 0.7154, 0.0721, 0), а векторы альфа и смещения остались с их значениями по умолчанию.

Значения – это коэффициенты преобразования RGB в оттенки серого. В какой-то момент я посмотрел на интернеты. Изменяя эти коэффициенты, вы можете изменить вклад входных каналов. Путем масштабирования каждой копии вектора и, необязательно, установки вектора смещения, вы можете разгладить вывод.

Вот первое решение, преобразованное в Swift (iOS 7 и выше):

 func blackAndWhiteImage(image: UIImage) -> UIImage { let context = CIContext(options: nil) let ciImage = CoreImage.CIImage(image: image)! // Set image color to b/w let bwFilter = CIFilter(name: "CIColorControls")! bwFilter.setValuesForKeysWithDictionary([kCIInputImageKey:ciImage, kCIInputBrightnessKey:NSNumber(float: 0.0), kCIInputContrastKey:NSNumber(float: 1.1), kCIInputSaturationKey:NSNumber(float: 0.0)]) let bwFilterOutput = (bwFilter.outputImage)! // Adjust exposure let exposureFilter = CIFilter(name: "CIExposureAdjust")! exposureFilter.setValuesForKeysWithDictionary([kCIInputImageKey:bwFilterOutput, kCIInputEVKey:NSNumber(float: 0.7)]) let exposureFilterOutput = (exposureFilter.outputImage)! // Create UIImage from context let bwCGIImage = context.createCGImage(exposureFilterOutput, fromRect: ciImage.extent) let resultImage = UIImage(CGImage: bwCGIImage, scale: 1.0, orientation: image.imageOrientation) return resultImage } 

Что касается ответов, предлагающих использовать CIColorMonochrome : теперь есть несколько выделенных оттенков серого, доступных из iOS7 (и OS X 10.9):

  • CIPhotoEffectTonal

    имитировать черно-белую фотографию без существенного изменения контраста.

  • CIPhotoEffectNoir:

    подражать черно-белой фотографии с преувеличенным контрастом

Источник: https://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html

Вот наиболее понравившийся ответ от @Shmidt, написанный как расширение UIImage с обновлением производительности в Swift:

 import CoreImage extension UIImage { func imageBlackAndWhite() -> UIImage? { if let beginImage = CoreImage.CIImage(image: self) { let paramsColor: [String : AnyObject] = [kCIInputBrightnessKey: NSNumber(double: 0.0), kCIInputContrastKey: NSNumber(double: 1.1), kCIInputSaturationKey: NSNumber(double: 0.0)] let blackAndWhite = beginImage.imageByApplyingFilter("CIColorControls", withInputParameters: paramsColor) let paramsExposure: [String : AnyObject] = [kCIInputEVKey: NSNumber(double: 0.7)] let output = blackAndWhite.imageByApplyingFilter("CIExposureAdjust", withInputParameters: paramsExposure) let processedCGImage = CIContext().createCGImage(output, fromRect: output.extent) return UIImage(CGImage: processedCGImage, scale: self.scale, orientation: self.imageOrientation) } return nil } } 

macOS (NSImage) Swift 3 версия @ преобразования FBente @ ответа Shmidt:

 extension NSImage { func imageBlackAndWhite() -> NSImage? { if let cgImage = self.cgImage(forProposedRect: nil, context: nil, hints: nil) { let beginImage = CIImage.init(cgImage: cgImage) let paramsColor: [String : AnyObject] = [kCIInputBrightnessKey: NSNumber(value: 0.0), kCIInputContrastKey: NSNumber(value: 1.1), kCIInputSaturationKey: NSNumber(value: 0.0)] let blackAndWhite = beginImage.applyingFilter("CIColorControls", withInputParameters: paramsColor) let paramsExposure: [String : AnyObject] = [kCIInputEVKey: NSNumber(value: 0.7)] let output = blackAndWhite.applyingFilter("CIExposureAdjust", withInputParameters: paramsExposure) if let processedCGImage = CIContext().createCGImage(output, from: output.extent) { return NSImage(cgImage: processedCGImage, size: self.size) } } return nil } } 

Я пробовал решение Shmidt, но мне кажется, что он слишком разоблачен на iPad Pro. Я использую только первую часть его решения без фильтра экспозиции:

 - (UIImage *)imageBlackAndWhite { CIImage *beginImage = [CIImage imageWithCGImage:self.CGImage]; CIImage *blackAndWhite = [CIFilter filterWithName:@"CIColorControls" keysAndValues:kCIInputImageKey, beginImage, @"inputBrightness", [NSNumber numberWithFloat:0.0], @"inputContrast", [NSNumber numberWithFloat:1.1], @"inputSaturation", [NSNumber numberWithFloat:0.0], nil].outputImage; CIImage *output = [blackAndWhite valueForKey:@"outputImate"]; CIContext *context = [CIContext contextWithOptions:nil]; CGImageRef cgiimage = [context createCGImage:output fromRect:output.extent]; //UIImage *newImage = [UIImage imageWithCGImage:cgiimage]; UIImage *newImage = [UIImage imageWithCGImage:cgiimage scale:image.scale orientation:image.imageOrientation]; CGImageRelease(cgiimage); return newImage; } 
  • iOS 5 не позволяет сохранять загруженные данные в папке «Документы»?
  • Можно ли ориентироваться на более старые версии iOS при использовании Xcode 4.2 и iOS 5 SDK?
  • Не удалось зарегистрироваться на сервере загрузки
  • Как Nike + GPS на iPhone получает обновления акселерометра в фоновом режиме?
  • фиксированное позиционирование iOS 5 и виртуальная клавиатура
  • Отключить автоматический подсчет ссылок для некоторых файлов
  • Свойства IBOutlet не обновляются при использовании метода prepareForSegue
  • Свойство CSS3 webkit-overflow-scrolling: touch ERROR
  • Можно ли программно перевернуть страницу в UIPageViewController?
  • NSArray слабых ссылок (__unsafe_unretained) для объектов под ARC
  • Круговые контрольные бары в IOS
  • Interesting Posts

    Как я могу отобразить список всех пакетов, установленных в моей системе Debian?

    Как заставить .NET использовать локальную копию сборки, которая находится в GAC

    Как хранить uuid в качестве номера?

    Не удается перезагрузить компьютер с помощью Win10 и нет доступа к BIOS

    Каков наилучший способ обмена данными между действиями?

    SQLITE3 VACUUM, «firebase database или диск заполнен»

    unsigned int и подписанное сравнение символов

    HQL левое соединение несвязанных объектов

    Есть ли проблемы с огромными папками?

    Как получить центр многоугольника в Google Maps v3?

    Непрерывная анимация вращения CSS при наведении, анимированная до 0deg при наведении

    Android: что лучше – несколько действий или переключения просмотров вручную?

    Как изменить стиль атрибута title внутри тега привязки?

    Преобразование растрового изображения в GrayScale в Android

    Как вы создаете Android View Pager с индикатором точек?

    Давайте будем гением компьютера.