Заполнить цвет определенной частью изображения?

Я хочу заполнить определенный цвет в определенной области изображения.

EX:

enter image description here

В приведенном выше Joker изображении, если прикоснитесь к волосам Джокер, затем заполните определенный цвет на волосах или коснитесь носа, затем заполните определенный цвет на носу и т.д. Надеюсь, вы поймете, что я пытаюсь сказать.

После googling это может быть достигнуто с помощью UIBezierPath или CGContext Reference, но я очень новичок в этом, я пытался прочитать эту документацию, но я не понимаю, что (требуется больше времени), у меня также есть время для этого проекта. Поэтому я не могу тратить на это больше времени.

Также я обнаружил, что мы можем использовать Алгоритм заполнения наводнений. Но я не знаю, как использовать в моем случае.

ПРИМЕЧАНИЕ: Я не хочу делить исходное изображение (например, волосы, нос, колпачок и т.д.), потому что, если я буду делать, в пакете будет так много изображений, Мне нужно обработать его как для обычного, так и для сетчатого устройства, поэтому этот вариант мне не поможет.

Поэтому, пожалуйста, дайте мне свое ценное предложение, а также скажите мне, что лучше для меня UIBezierPath или Справочник по CGContext? Как я могу заполнить цвет на определенной части изображения? и/или мы можем заполнить цвет под черной границей области? Потому что я новичок в Quartz 2D Programming.

Ответы

Ответ 1

Используйте библиотеку Github ниже. В сообщении используется алгоритм заполнения заливки: UIImageScanlineFloodfill

Описание Objective C: ObjFloodFill

Если вы хотите посмотреть подробное объяснение алгоритма: Рекурсия, объясненная с помощью алгоритма заполнения наводнений (и зомби и кошки)

несколько других учебных пособий на других языках: Учебник по компьютерной графике Lode: Flood Fill

Ответ 2

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

Я рекомендую использовать вызовы CoreGraphics, такие как CGContextStrokePath() и CGContextFillPath(), чтобы сделать чертеж. Это, вероятно, будет выглядеть лучше, чем использование заливки флуда, потому что вы получите красиво сглаженные края.

У Apple есть хорошая документация о том, как рисовать с помощью Quartz 2D. В частности, раздел в разделе "Пути" полезен для того, что вы пытаетесь сделать.

Ответ 3

Вы можете скопировать контекст на основе изображения Альфа-прозрачность

Я создал быстрое изображение с черным цветом и альфа

enter image description here

Затем, используя приведенный ниже код

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext(); // Get the context
    CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor); // Set the fill color to be blue

    // Flip the context so that the image is not flipped
    CGContextTranslateCTM(context, 0, rect.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    // Clip the context by a mask created from the image
    UIImage *image = [UIImage imageNamed:@"image.png"];
    CGImageRef cgImage = image.CGImage;
    CGContextClipToMask(context, rect, cgImage);

    // Finally fill the context with the color and mask you set earlier
    CGContextFillRect(context, rect);
}

Результат

enter image description here

Это быстрый намек на то, что вы можете сделать. Однако теперь вам нужно преобразовать свое изображение, чтобы добавить альфа-прозрачность в части, которые нужно удалить.

После быстрого поиска я нашел эти ссылки

Как я могу изменить цвет "белый" с UIImage на прозрачный

Как сделать один цвет прозрачным в UIImage

Ответ 4

Если вы создадите свое изображение в качестве векторного базового изображения SVG, оно будет очень легким (меньше, чем png, jpg) и очень простым в управлении с помощью Quartz 2D с использованием безьеров. Пути Безье могут быть заполнены (белый при запуске). У UIBezierPath есть метод (containsPoint:), который помогает определить, щелкнете ли вы внутри.