Frage

Mein iOS-Gerät führt keine Prozesse mit CITemperatureAndTint und CIToneCurve durch

aber im Falle von CISepiaTone geht es richtig !!

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;

Gibt es ein Problem damit?

War es hilfreich?

Lösung

Verwenden Sie diesen Code: Es funktioniert

- (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 enthält 5 NSValue-Kurvenpunkte von Anfang bis Ende.

Andere Tipps

Das sieht richtig aus.Haben Sie zuerst versucht, mit setDefaults zu initialisieren?

Eine normale Tonkurve ist eine gerade Linie von (0,0) bis (1,1). Dies ist die Linie, die Ihre Eingabewerte bilden, und die Linie, die durch 'setDefaults' festgelegt wird.

Normale Tonkurve:

Standardtonkurve  Bildbeschreibung hier eingeben

Wenn Sie Ihre "Eingabepunkte" ändern, um eine andere Kurve zu erstellen, wird der Filter angewendet.Versuchen Sie für eine negative Belichtung:

inputPoint0 = (0,1)
inputPoint1 = (0.25,0.75)
inputPoint2 = (0.5,0.5)
inputPoint3 = (0.75,0.25)
inputPoint4 = (1,0)

Oder für eine atypische Zeile:

Atypische Tonkurve

Gefiltertes Bild

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top