Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 更改uiimage饱和度的最有效方法(在动画期间)_Ios_Uiimageview_Uiimage_Hsv_Ciimage - Fatal编程技术网

Ios 更改uiimage饱和度的最有效方法(在动画期间)

Ios 更改uiimage饱和度的最有效方法(在动画期间),ios,uiimageview,uiimage,hsv,ciimage,Ios,Uiimageview,Uiimage,Hsv,Ciimage,我试图在动画期间更改UIImage饱和度。但这样做似乎太重/太慢: -(void) changeSaturation:(CGFloat)value{ CIContext * context = [CIContext contextWithOptions:nil]; CIFilter *colorControlsFilter = [CIFilter filterWithName:@"CIColorControls"]; CIImage *image = self.imageView.ima

我试图在动画期间更改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顶部的一层来实现这一点

有人能告诉我如何实现我的目标吗?

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"];
            }
    }
}
-(UIImage*)更改饱和度:(CGFloat)值
{
//你的过滤过程
}
-(无效)更改饱和度:(CGFloat)值持续时间:(CGFloat)持续时间
{
调度异步(调度获取全局队列(调度队列优先级高,0)^{
重新计数=ceil(持续时间*60);
CGFloat incrimentValue=价值/CADROUNT;
NSMUTABLEARRY*mutArrayAnimationValues=[NSMUTABLEARRY new];

对于(int-cadreIndex=0;cadreIndex我的主要问题是被拖动的视图包含一个大分辨率图像。我上面的解决方案非常好。

如果在0.0和1.0之间更改饱和度,可以添加黑白(灰度)图像高于正常图像并更改为alpha。这将是最有效的。

您的问题动画或滞后?动画沿途中断需要平滑更改图像?我想问题应该与图像更改或创建有关。您的答案中不确定,您指的是-(无效)更改饱和度:(CGFloat)中的“持续时间”值duration:(CGFloat)duration。这应该是动画的持续时间吗?如果是,我不知道它的长度。正如我所提到的,用户拖动此视图是为了让它可以持续很久。也许,将duration设置为0.1s