1

アニメーション中に UIImage の彩度を変更しようとしています。しかし、このようにするには重すぎる/遅すぎるようです:

-(void) changeSaturation:(CGFloat)value{

CIContext * context = [CIContext contextWithOptions:nil];

CIFilter *colorControlsFilter = [CIFilter filterWithName:@"CIColorControls"];

 CIImage *image = self.imageView.image.CIImage;

[colorControlsFilter setValue:image forKey:@"inputImage"];

[colorControlsFilter setValue:[NSNumber numberWithFloat:value] forKey:@"inputSaturation"];

CIImage *outputImage = [colorControlsFilter outputImage];

CGImageRef cgimg = [context createCGImage:outputImage
                                 fromRect:[outputImage extent]];

UIImage *newImage = [UIImage imageWithCGImage:cgimg];
self.imageView.image = newImage;

CGImageRelease(cgimg);}

このメソッドは、ビューがユーザーによってドラッグされるたびに呼び出されます (距離が変化すると、彩度も変化します)。これは明らかに正しい方法ではありませんが、同様の動作が必要です。UIImageviewの上にあるレイヤーでこれを達成できるのだろうか。

誰かが私の目標を達成する方法についてアドバイスできますか?

4

3 に答える 3

1

私の主な問題は、ドラッグされているビューに高解像度の画像が含まれていたことです。上記の私の解決策は完全にうまくいきます。

于 2014-12-14T07:44:05.240 に答える
1

1)非同期メソッドでフィルタリングされた画像を計算します:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

        UIImage * filtredImage = /*Your method*/

        dispatch_async(dispatch_get_main_queue(), ^{
             self.imageView.image = filtredImage;
        }
}

2) イメージのスムーズな変更: coreAnimation を使用します。self.layer - あなたのビューで一番上の CALayer です

- (UIImage*)changeSaturation:(CGFloat)value
{
     //Your filter process
}
- (void)changeSaturation:(CGFloat)value duration:(CGFloat)duration
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

            NSUInteger cadreCount = ceil(duration * 60);
            CGFloat incrimentValue = value / cadreCount;

            NSMutableArray * mutArrayAnimationValues = [NSMutableArray new];

            for (int cadreIndex = 0; cadreIndex <= cadreCount; cadreIndex++)
            {
                  CGFloat currentValue = incrimentValue * cadreIndex;
                  UIImage * imageForCurrentCadr = [self changeSaturation:currentValue];
                  [mutArrayAnimationValues addObject:(id)imageForCurrentCadr.CGImage];
            }

            dispatch_async(dispatch_get_main_queue(), ^{

                 self.layer.contents = (id)[mutArrayAnimationValues lastObject];

                 CAKeyframeAnimation *animation = [CAKeyframeAnimation               animationWithKeyPath:@"contents"];
                 [animation setValues:mutArrayAnimationValues];
                 [animation setDuration:duration];
                 [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]];
                 [animation setFillMode:kCAFillModeBoth];
                 [pathAnimation setRemovedOnCompletion:NO];
                 [self.layer addAnimation:pathAnimation forKey:@"imageAnimation"];
            }
    }
}
于 2014-12-10T20:54:24.343 に答える