Search code examples
iosios5core-image

CITemperatureAndTint and CIToneCurve do not WORK


my iOS device doesn't do any process with CITemperatureAndTint and CIToneCurve

but, in case of CISepiaTone is doing right !!

outputImage = [CIFilter filterWithName:@"CIToneCurve" keysAndValues:@"inputImage", image, @"inputPoint0", [CIVector vectorWithX:0 Y:0], @"inputPoint1", [CIVector vectorWithX:0.25 Y:0.25], @"inputPoint2", [CIVector vectorWithX:0.5 Y:0.5], @"inputPoint3", [CIVector vectorWithX:0.75 Y:0.75], @"inputPoint4", [CIVector vectorWithX:1 Y:1], nil].outputImage;

Is there any problem with that??


Solution

  • Use this code : It works

    - (UIImage*)applyToneCurve:(NSArray*)pointArray {
    
        if ([pointArray count] < 2) {
            return self;
        }
    
        CGPoint first = [[pointArray objectAtIndex:0] CGPointValue];
    
        first.x /= 255.0;
        first.y /= 255.0;
    
        CGPoint firstPoint = first;
    
        CGPoint last = [[pointArray lastObject] CGPointValue];
    
        last.x /= 255.0;
        last.y /= 255.0;
    
        CGPoint fifthPoint = last;
    
        CGPoint secondPoint = CGPointMake(0.25, 0.25);
        CGPoint thirdPoint  = CGPointMake(0.50, 0.50);
        CGPoint fourthPoint = CGPointMake(0.75, 0.75);
    
        for (int i = 1; i < [pointArray count] - 1; i++) {
    
            CGPoint point = [[pointArray objectAtIndex:i] CGPointValue];
    
            point.x /= 255.0;
            point.y /= 255.0;
    
            if (i == 1) {   
                secondPoint = point;
            }
            else if (i == 2) {
                thirdPoint = point;
            }
            else if (i == 3)
                fourthPoint = point;
    
        }
    
        CIImage *inputImage = [CIImage imageWithCGImage:self.CGImage];
    
        CIFilter *toneCurveFilter = [CIFilter filterWithName:@"CIToneCurve"];
        [toneCurveFilter setDefaults];
        [toneCurveFilter setValue:inputImage forKey:kCIInputImageKey];
    
        [toneCurveFilter setValue:[CIVector vectorWithX:firstPoint.x  Y:firstPoint.y] forKey:@"inputPoint0"];
    
        [toneCurveFilter setValue:[CIVector vectorWithX:secondPoint.x  Y:secondPoint.y] forKey:@"inputPoint1"];
    
        [toneCurveFilter setValue:[CIVector vectorWithX:thirdPoint.x Y:thirdPoint.y] forKey:@"inputPoint2"]; 
    
        [toneCurveFilter setValue:[CIVector vectorWithX:fourthPoint.x Y:fourthPoint.y] forKey:@"inputPoint3"]; 
    
        [toneCurveFilter setValue:[CIVector vectorWithX:fifthPoint.x Y:fifthPoint.y] forKey:@"inputPoint4"];
    
        CIImage *outputImage = [toneCurveFilter outputImage];
    
        CGImageRef ref = [[CIContext contextWithOptions:nil] createCGImage:outputImage fromRect:outputImage.extent];
    
        UIImage *result = [UIImage imageWithCGImage:ref];
    
        if (ref) {
    
            CGImageRelease(ref);
        }
    
        return result;    
    }
    

    PointArray contains 5 NSValue points of curve from start to end.