10

iOS 5.x 中是否有一种简单的方法(或内置库)可以使 UIImage 去饱和?这是我目前的做法:

CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);

    CGContextTranslateCTM(context, 0.0, self.bounds.size.height); // flip image right side up
    CGContextScaleCTM(context, 1.0, -1.0);

    CGContextDrawImage(context, rect, self.image.CGImage);
    CGContextSetBlendMode(context, kCGBlendModeSaturation);
    CGContextClipToMask(context, self.bounds, image.CGImage); // restricts drawing to within alpha channel
    CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, desaturation);
    CGContextFillRect(context, rect);

    CGContextRestoreGState(context); // restore state to reset blend mode

这似乎比我预期的要复杂一些。还有比这更简单的方法吗?

我在考虑核心图像,但我似乎找不到一个具体的例子来说明如何使用它来去饱和图像。

4

1 回答 1

21

您可以使用我的开源GPUImage框架使用两三行代码来做到这一点:

UIImage *inputImage = [UIImage imageNamed:@"inputimage.png"];    
GPUImageGrayscaleFilter *grayscaleFilter = [[GPUImageGrayscaleFilter alloc] init];
UIImage *grayscaleImage = [grayscaleFilter imageByFilteringImage:inputImage];

(如果不使用 ARC 构建,请记住释放过滤器)

这会将图像降低到其亮度值,使其去饱和。如果您想要可变饱和度/去饱和度,您可以使用 GPUImageSaturationFilter。正如框架名称所示,此过滤在 GPU 上运行,并且在我从 5.1 开始在 iOS 上进行基准测试的几乎所有情况下都比 Core Image 更快。

于 2012-06-06T03:45:59.677 回答