Эффект разделенного тона с использованием основных фильтров изображения? - PullRequest
12 голосов
/ 01 ноября 2011

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

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

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

Ответы [ 2 ]

6 голосов
/ 16 января 2012

Я получил очень похожий эффект, впервые применив 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");
3 голосов
/ 09 января 2012

Я немного читал о том, как это сделать в 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-й только для синего), а затем объединили результаты. Вы установили бы 2-ю точку ниже 0,25 и 4-ю точку выше 0,75 красным и зеленым, а противоположную синим.

...