使用核心图像过滤器创建分色调效果?

13

我理解分割色调效果的原理,想要使用颜色映射或个别RGB通道的色调曲线。不幸的是,目前iOS没有包括这些滤镜,不能实现。

我找到的唯一方法(除了通过OpenGL渲染)就是复制一个图像,在一个图像中调整亮部色相,在另一个图像中调整暗部色相,然后进行合并。但是,我更喜欢一种更简单的方式,不需要两个操作链的组合。

在iOS 5中的任何当前可用的核心图像滤镜链中是否有可能实现这样的效果?


1
你好,能否请您分享一下您是如何创建CIColorCube数据的? - Janak Nirmal
2个回答

6
我通过首先应用CIFalseImage得到了非常相似的效果。 选择你想要的深色和浅色(深蓝和红色或橙色)。 当你为两种颜色创建CIColor时,将alpha设置为0.5。
接下来使用CIScreenBlendMode并将该过滤后的图像与原始图像混合。 它看起来像是一种分裂色调。
这是一个快速更改阴影和高光的好方法。
CIFilter *lightDark = [CIFilter filterWithName:@"CIFalseColor"
                                       keysAndValues: @"inputImage", helper.ciImage, nil];
[lightDark setDefaults];
CIColor *myBlue = [CIColor colorWithRed:0.0 green:0.0 blue:0.6 alpha:0.5];
CIColor *myRed = [CIColor colorWithRed:1.0 green:0.8 blue:0.0 alpha:0.5];

[lightDark setValue:myBlue forKey:@"inputColor0"];
[lightDark setValue:myRed forKey:@"inputColor1"];
CIImage *mappedImage = [lightDark valueForKey:kCIOutputImageKey];

CIFilter *screenBlend = [CIFilter filterWithName:@"CIScreenBlendMode" keysAndValues: @"inputImage", mappedImage, @"inputBackgroundImage", helper.ciImage, nil];
CIImage *finalImage = [screenBlend valueForKey:kCIOutputImageKey];

if (finalImage) imageView.image = [UIImage imageWithCIImage:finalImage orientation:orientation];
else NSLog(@"Missing our image");

谢谢,但正如我所提到的,我正在寻找一些不需要混合组合的东西。这与我最初使用的东西接近,尽管没有虚假颜色。可能看起来很酷,我会试试。 - akaru

3
我已经了解了如何在Photoshop中完成这个操作,基本上是增加红色和绿色通道的对比度,并减少蓝色通道的对比度。(至少对于基本效果是这样 - 如果你用胶片来实际做,也可以得到一些非常奇怪的颜色偏移!)
您可以使用一系列的CIColorMatrix节点进行对比度调整。对比度基本上是((value - 0.5) * contrast) + 0.5。因此,例如,一个红色和绿色对比度为1.5,蓝色对比度为0.66的颜色矩阵将是这样的:
| 1 0 0 -0.5 |   | 1.5 0.0 0    0 |   | 1 0 0 0.5 |
| 0 1 0 -0.5 | + | 0   1.5 0    0 | + | 0 1 0 0.5 |
| 0 0 1 -0.5 |   | 0   0.0 0.66 0 |   | 0 0 1 0.5 |
| 0 0 0  1.0 |   | 0   0.0 0.0 1.0|   | 0 0 0 1.0 |

CIColorCube可以实现更复杂的转换,但它的数据格式很复杂。您需要创建一个三维查找表。

如果您进行了3次单独的传递(或者可能只有2次 - 一次用于红色和绿色,第二次仅用于蓝色),然后合并结果,CIToneCurve就可以做到这一点。在红色和绿色中,您将第二个点设置为低于0.25,第四个点设置为高于0.75,在蓝色中则相反。


我已经尝试了很多方法来创建 CIColorCube 的数据 (http://stackoverflow.com/questions/8538392/how-to-format-the-data-input-for-cicolorcube)。我曾经认为线性无法产生分裂色调效果,但它确实接近。可惜 CIToneCurve 不能单独处理 RGB 通道。如果您知道如何创建适合 CIColorCube 的正确数据,请告诉我。 - akaru
将多个 CITones 进行链接是否实际上会为每个通道带来变化? - Eric
我认为你不能简单地将它们链接在一起。我认为你需要分别处理每个通道,然后从每个通道中提取红色、绿色和蓝色通道,并将它们重新组合在一起。 - user1118321
从我所看到的情况来看,将它们链接起来似乎不起作用。您如何提取红色、绿色和蓝色通道并将它们重新组合? - inks2002
你可以将想要的曲线应用于图像的红色和绿色通道,然后通过一个颜色矩阵运行它,其中蓝色通道(矩阵的第三行)设置为所有0。对于蓝色通道,执行相反的操作-先将原始图像通过蓝色色调曲线,然后通过一个颜色矩阵,其中红色和绿色通道都是0。然后使用CIAdditionCompositing混合这两个图像。 - user1118321

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接