Как создать пользовательские цветовые фильтры с помощью CoreImage или Metal Performance Shaders? - PullRequest
0 голосов
/ 23 января 2019

Мне нужно создать цветовые фильтры на основе значений RGBA.Это нормально для меня - Core Image или Metal Performance Shaders.Базовое изображение с некоторыми фильтрами по умолчанию.Но мне нужны фильтры с цветовыми кодами RGBA.Можно ли создать такие фильтры?

Я пробовал это, но это не ожидаемый результат.Я ожидаю, как Sepia Tone Filter с разными цветами.(Фильтр должен применяться ко всему кадру)

@interface CustomFilterByColor : CIFilter

@property(nonatomic, retain) CIImage *inputImage;

@end



#import "CustomFilterByColor.h"

@implementation CustomFilterByColor

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

    });

    return kernel;
}

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

Это работает для меня.Получаем в результате изображение вот так

enter image description here

Но это не ожидаемый фильтр.Я ожидаю только цветные фильтры.как

enter image description here

Надеюсь, вы поняли мою точку зрения.

1 Ответ

0 голосов
/ 26 января 2019

Я попробовал это, хорошо работает для меня.Вы можете дать любой цвет, который вы хотите.это даст выходное изображение с этим цветом.Вы также можете изменить интенсивность этого цвета.

   UIColor *color = [UIColor blueColor];
    /*
    [UIColor colorWithRed:255.0f/255.0f
                                     green:255.0f/255.0f
                                      blue:0.0f/255.0f
                                     alpha:0.4f];;*/

    CIColor *ciColor = [CIColor colorWithCGColor:color.CGColor];


    CIImage *outputImg = [CIFilter filterWithName:@"CIColorMonochrome" keysAndValues:kCIInputImageKey, frameImage, @"inputIntensity", [NSNumber numberWithFloat:0.6], @"inputColor", ciColor, nil].outputImage;
...