2012-01-17 20 views
0

私のiOSデバイスがCITemperatureAndTintとCIToneCurveでCITemperatureAndTintとCIToneCurveは

を任意のプロセスを行いませんが、CISepiaToneの場合は右やっている動作しません!

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; 

これに問題はありますか?

答えて

1

使用このコードを:それは

- (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は、開始から終了までの曲線の5つのNSValueポイントが含まれています。

0

これは正しく表示されます。最初にsetDefaultsで初期化を試しましたか?

0

通常のトーンカーブは、(0,0)から(1,1)までの直線です。これは入力値の行で、 'setDefaults'で設定された行です。

ノーマルトーンカーブ:

Default Tone Curveenter image description here

あなたは別のカーブを作るために、あなたの「inputPoints」を変更した場合は、フィルタが適用されて表示されます。負の露出のために、試してみてください。

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

または非定型行のために:

Atypical Tone Curve

Filtered Image