2016-07-28 1 views
2

J'ai intégré une caméra personnalisée dans mon application. Donc, je crée cet appareil photo en utilisant AVCaptureDevice. J'ai également mis GrayScale sur cette caméra personnalisée en utilisant Set GrayScale on Output of AVCaptureDevice in iOS cela.Effet d'ajout de saturation sur AVCaptureDevice dans iOS

Maintenant, je veux ajouter l'effet de saturation sur l'appareil photo. "Indice de sursaturation" doit être calculé selon la formule fournie. (convertir le pixel de surexposition (R, G, B> = 255) en jaune (RGB 255,255,0)).

Je veux l'effet exact qui est montré dans l'image suivante.

enter image description here

Je crée GrayScale en utilisant le code suivant: -

let sepiaColor = CIColor(
    red: 1.0/0.30078125, 
    green: 1.0/0.5859375, 
    blue: 1.0/0.11328125 
) 

filter = CIFilter(
    name: "CIColorMonochrome", 
    withInputParameters: [ 
     "inputColor" : sepiaColor, 
     "inputIntensity" : 1.0 
    ] 
) 

Comment puis-je créer ce sur l'effet de saturation à l'aide CIFilter.? J'ai examiné le document Core Image Filter Reference pour CIFilter. Mais n'a pas eu idée de comment créer cet effet en utilisant cela. Peut être CIColorCrossPolynomial ou CIColorMap travaillent pour cela.

Y a-t-il un moyen de créer cet effet sur AVCaptureDevice?

Toute aide serait appréciée. :)

+1

Je voudrais créer mon propre filtre. Vous pouvez suivre ces étapes pour ce faire: https://developer.apple.com/library/ios/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_custom_filters/ci_custom_filters.html –

+0

Cette WWDC explique comment faire cela: https: // developer .apple.com/videos/play/wwdc2014/514/ –

+0

Merci @KunalShrivastava. S'il vous plaît fournir un exemple de code pour cela. Donc c'est bon moi. –

Répondre

1

Votre logique/algorithme:

(convertir pixel de surexposition (R, G, B> = 255) à jaune (RVB 255,255,0))

ira dans le noyau, qui est essentiellement le calcul que vous voulez effectuer sur chaque pixel.

Voici un simple filtre que j'ai écrit. Dans la condition if du noyau, écrivez votre propre condition. La partie puis convertit déjà le pixel en (255, 255, 0).

.h

#import <CoreImage/CoreImage.h> 

@interface CustomFilter : CIFilter 

@property(nonatomic, retain) CIImage *inputImage; 

-(CIImage*)outputImage; 

@end 

.m

#import "CustomFilter.h" 

@implementation CustomFilter 

-(CIColorKernel*)myKernel 
{ 
    static CIColorKernel *kernel = nil; 
    static dispatch_once_t once; 
    dispatch_once(&once, ^{ 
     kernel = [CIColorKernel kernelWithString: 
        @"kernel vec4 CustomFilter (__sample s) \n { \n if (s.r + s.g + s.b < 0.1) \n { return s.rgba = vec4(1.0, 1.0, 0.0, 1.0); } \n else \n { return s.rgba; } \n }"]; 
    }); 

    return kernel; 
} 

-(CIImage*)outputImage 
{ 
    CGRect dod = _inputImage.extent; 
    return [[self myKernel] applyWithExtent:dod arguments:@[_inputImage]]; 
} 

@end 
+1

Grand @kunal. Ça marche. Merci. J'utilise cette condition s.r + s.g + s.b> = 1.0 au lieu de la vôtre. Merci encore. –