Сплит-эффект с использованием фильтров изображения ядра?

Я понимаю принципы эффекта разделения тона и хотел бы использовать либо цветовую карту, либо тональные кривые для отдельных каналов rgb. К сожалению, это не вариант для iOS на данный момент, поскольку SDK не включает эти фильтры.

Единственный хак, который я придумал (кроме выполнения рендеринга через opengl), дублирует изображение, корректируя оттенок в бликах в одном, тени в другом и объединяя их. Однако я бы предпочел более простой способ, который не требует двухцелевой составной операции.

Возможно ли такое действие с цепочкой любого из доступных в настоящее время фильтров изображения ядра в iOS 5?

Ответ 1

Я немного читал о том, как это сделать в Photoshop, и это в основном увеличивает контраст в красных и зеленых каналах и уменьшает его в синих каналах. (По крайней мере, для базового эффекта - если вы действительно делаете это с фильмом, вы можете получить некоторые действительно странные изменения цвета тоже!)

Вы можете выполнить настройку контраста с помощью серии узлов CIColorMatrix. Контраст в основном ((значение - 0,5) * контраст) + 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 может воспроизводить более сложные преобразования, но формат его данных сложный. Вам нужно создать таблицу 3D-поиска.

CIToneCurve может это сделать, если вы сделали 3 отдельных прохода (или, может быть, только 2 - один для красного и зеленого, а второй для синего), а затем объединили результаты. Вы установили бы 2-ю позицию ниже 0,25, а 4-е место выше 0,75 в красном и зеленом, а в синем - наоборот.

Ответ 2

Я получил очень похожий эффект, сначала применив CIFalseImage. Выберите свой темный и светлый цвет (синий, красный или оранжевый). Когда вы создаете CIColor для двух цветов, установите альфа для .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");