2

我必须更改 的颜色级别UIImage,根据这篇文章,我正在尝试使用开源库ios-image-filters但我不知道如何使用该方法
- (UIImage*) levels:(NSInteger)black mid:(NSInteger)mid white:(NSInteger)white;

我不是设计师,我不太了解 Photoshop :(
这是 Photoshop 的屏幕截图和我应该应用于我的颜色级别UIImagephotoshop截图

这是我尝试使用该levels方法的方式:

UIImage *image = [UIImage imageNamed:@"my_image.png"];
image = [image levels:45 mid:0.95 white:238]; // 0.95 is float/double and it's obviously not the good way to do what I want. 

根据方法注释,所有参数的值应在 0-255 之间。但是 Photoshop 中的 mid 参数是一个值 -9.99-0.01

Photoshop中的黑白水平显然是很好的价值,但我不明白中间值是如何工作的。我应该如何转换它?

所以我的问题是:如何levels像在 Photoshop 中一样使用该方法?

4

1 回答 1

1

我不确定它们是否完全可比。查看源代码,该库的levels方法正在调用一个简单的线性插值函数(暂时忽略whiteand的black东西,关注mid它以及它是如何影响的color):

int calcLevelColor(int color, int black, int mid, int white)
{
    if (color < black) {
        return 0;
    } else if (color < mid) {
        int width = (mid - black);
        double stepSize = ((double)width / 128.0f);
        return (int)((double)(color - black) / stepSize);
    } else if (color < white) {
        int width = (white - mid);
        double stepSize = ((double)width / 128.0f);
        return 128 + (int)((double)(color - mid) / stepSize);
    }

    return 255;
}

但是,Photoshop 在“级别”中的中点使用伽玛值,即指数函数,其结果为color^(1/gamma),即pow(color, 1.0 / gamma)(其中color是介于 0.0 和 1.0 之间的值,gamma大于零且小于十)。这就是为什么 Photoshop 中点的值遵循对数刻度而不是线性刻度的原因。


如果您想使用像 Photoshop 这样的中点值(无论如何,对于照片,它可能比这个 ios-image-filters 库中的再现更好)使用核心图像过滤器,如我如何将 Photoshop 的级别调整映射到核心图像过滤器?.

于 2013-08-15T07:20:48.997 回答