2015-10-09 6 views
1

Я создал то, что, как я считаю, должен быть подходящим CIFilter в градациях серого, используя CIColorMonochromeFilter, настроенный для белого. Для меня это выглядит очень мрачно, но я не эксперт, так что мне просто интересно, является ли это точной реализацией фильтра в оттенках серого.Как реализовать фильтр в оттенках серого с использованием фильтров CoreImage?

Я не написал код, чтобы сбрасывать и тестировать пиксели, но в зависимости от формата изображения, уже являющегося RBG, мне любопытно, в каком формате будет отображаться выходное изображение. Например, как бы я узнал, является ли каждый пиксель одним компонентом или тремя компонентами?

Я знаю, что CIImage - это всего лишь рецепт для изображений и что я должен использовать CGImageRef для рендеринга. Я просто не понимаю, в каком формате пикселей я должен ожидать, что данные будут.

CIFilter * monoChromeFilter = [CIFilter filterWithName:kCIColorMonochromeFilterName];  
[monoChromeFilter setValue:self.inputImage forKey:kCIInputImageKey]; 

CIColor * white = [CIColor colorWithRed:1.0 green:1.0 blue:1.0]; 
[monoChromeFilter setValue:white forKey:kCIInputColorKey]; 
+0

Так что вопрос? Это просто, что вы не знаете, как читать значение пикселя изображения? Это довольно хорошо документировано в Stack Overflow. – matt

+0

Более или менее то, что я делаю, на самом деле является подходящим фильтром в оттенках серого, например. Монохромный белый - полутоновый. Мне любопытно формат вывода, хотя это скорее второстепенный вопрос. –

ответ

2

Я надеюсь, что это может помочь вам (это скор.)

static func convertToBlackAndWhite(image:UIImage) -> UIImage? 
{ 
     //first do color controls 
     let ciImage = CIImage(image:image) 
     let filter = CIFilter(name: "CIColorControls") 
     filter.setValue(ciImage, forKey: kCIInputImageKey) 
     filter.setValue(0.0, forKey: kCIInputBrightnessKey) 
     filter.setValue(0.0, forKey: kCIInputSaturationKey) 
     filter.setValue(1.1, forKey: kCIInputContrastKey) 

     let intermediateImage = filter.outputImage 

     let filter1 = CIFilter(name:"CIExposureAdjust") 
     filter1.setValue(intermediateImage, forKey: kCIInputImageKey) 
     filter1.setValue(0.7, forKey: kCIInputEVKey) 
     let output = filter1.outputImage 

     let context = CIContext(options: nil) 
     let cgImage = context.createCGImage(output, fromRect: output.extent()) 

     return UIImage(CGImage: cgImage, scale: image.scale, orientation: image.imageOrientation) 
} 
+0

Спасибо за ваш ответ. Не могли бы вы рассказать о том, как этот подход отличается от подхода фильтра CIColorMonochrome и почему необходим CIExposureAdjust? –