Core Image CIColorControls亮度滤镜会产生错误的效果.如何更改图像的亮度?

Ell*_*iot 16 graphics core-graphics core-image ios ios5

我正在为iOS创建一个颜色选择器.我想让用户选择亮度(亮度)并让色轮反映这种变化.我正在使用Core Image通过CIColorControls过滤器修改亮度.这是我的代码:

-(CIImage *)oldPhoto:(CIImage *)img withBrightness:(float)intensity
{
    CIFilter *lighten = [CIFilter filterWithName:@"CIColorControls"];
    [lighten setValue:img forKey:kCIInputImageKey];
    [lighten setValue:@((intensity * 2.0) - 1.0) forKey:@"inputBrightness"];
    return lighten.outputImage;
}
Run Code Online (Sandbox Code Playgroud)

以下是色轮在强度= 0.5(inputBrightness = 0)时的外观:

inputBrightness = 0的我的图像

问题是当强度<0.5时,色轮看起来不对劲.例如,这是它的强度= 0.3(inputBrightness = -0.4):

我的图像是inputBrightness = -0.4

请注意,中间有一个黑色圆圈,图像的其余部分也没有正确变暗.这应该是一个HSL色轮,所以我想我真正想要改变的是亮度,而不是亮度.

首先,任何人都可以解释为什么图像看起来像这样?我不是色彩方面的专家; 看起来奇怪的是圆圈的中心快速剪成黑色,而它的边缘不会变暗.

第二,我怎样才能达到我想要的效果?

这是我实际上想要看图像的方式:

亮度= 0.3的图像,在CPU上用HSL函数生成(太慢)

这是使用自定义HSL函数创建的,亮度= 0.3.这在CPU上运行,因此对我的需求来说太慢了.我很乐意发布这个HSL函数的代码,但我没有包含它,因为它似乎没有立即相关.如果你想看到它,请问.

如果您有任何疑问,或者有任何不清楚的地方,请告诉我.谢谢!

Rob*_*Rob 6

我还发现了的非线性kCIInputBrightnessKeyCIColorControls是恼人.我雇了一个线性的CIToneCurve:

/** Change luminosity of `CIImage`

 @param inputImage The `CIImage` of the image to have it's luminosity changed.
 @param luminosity The percent change of the luminosity, ranging from -1.0 to 1.0.

 @return `CIImage` of image with luminosity changed. If luminosity of 0.0 used, original `inputImage` is returned.
 */

- (CIImage *)changeLuminosityOfCIImage:(CIImage *)inputImage luminosity:(CGFloat)luminosity
{
    if (luminosity == 0)
        return inputImage;

    NSParameterAssert(luminosity >= -1.0 && luminosity <= 1.0);

    CIFilter *toneCurveFilter = [CIFilter filterWithName:@"CIToneCurve"];
    [toneCurveFilter setDefaults];
    [toneCurveFilter setValue:inputImage forKey:kCIInputImageKey];

    if (luminosity > 0)
    {
        [toneCurveFilter setValue:[CIVector vectorWithX:0.0  Y:luminosity]                           forKey:@"inputPoint0"];
        [toneCurveFilter setValue:[CIVector vectorWithX:0.25 Y:luminosity + 0.25 * (1 - luminosity)] forKey:@"inputPoint1"];
        [toneCurveFilter setValue:[CIVector vectorWithX:0.50 Y:luminosity + 0.50 * (1 - luminosity)] forKey:@"inputPoint2"];
        [toneCurveFilter setValue:[CIVector vectorWithX:0.75 Y:luminosity + 0.75 * (1 - luminosity)] forKey:@"inputPoint3"];
        [toneCurveFilter setValue:[CIVector vectorWithX:1.0  Y:1.0]                                  forKey:@"inputPoint4"];
    }
    else
    {
        [toneCurveFilter setValue:[CIVector vectorWithX:0.0  Y:0.0]                     forKey:@"inputPoint0"];
        [toneCurveFilter setValue:[CIVector vectorWithX:0.25 Y:0.25 * (1 + luminosity)] forKey:@"inputPoint1"];
        [toneCurveFilter setValue:[CIVector vectorWithX:0.50 Y:0.50 * (1 + luminosity)] forKey:@"inputPoint2"];
        [toneCurveFilter setValue:[CIVector vectorWithX:0.75 Y:0.75 * (1 + luminosity)] forKey:@"inputPoint3"];
        [toneCurveFilter setValue:[CIVector vectorWithX:1.0  Y:1 + luminosity]          forKey:@"inputPoint4"];
    }

    return [toneCurveFilter outputImage];
}
Run Code Online (Sandbox Code Playgroud)

这是您的图像,使用上述例程将亮度降低30%:

减少

它可以完成CIToneCurve.无论它比你的日常工作更快,你都会有它的基准.


小智 2

尝试这个并使用滑块更改值:-

- (void)viewDidLoad{

   UIImage *aUIImage = showPickedImageView.image;
   CGImageRef aCGImage = aUIImage.CGImage;
   aCIImage = [CIImage imageWithCGImage:aCGImage];


   context = [[CIContext contextWithOptions:nil] retain];
   brightnessFilter = [[CIFilter filterWithName:@"CIColorControls" keysAndValues: @"inputImage", aCIImage, nil] retain];

}

- (IBAction)brightnessSliderValueChanged:(id)sender {

    [brightnessFilter setValue:[NSNumber numberWithFloat:brightnessSlider.value ] forKey: @"inputBrightness"];
    outputImage = [brightnessFilter outputImage];
    CGImageRef cgiig = [context createCGImage:outputImage fromRect:[outputImage extent]];
    newUIImage = [UIImage imageWithCGImage:cgiig];
    CGImageRelease(cgiig);
    [showPickedImageView setImage:newUIImage];
}
Run Code Online (Sandbox Code Playgroud)