Заполнить цвет определенной частью изображения?
Я хочу заполнить определенный цвет в определенной области изображения.
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:), который помогает определить, щелкнете ли вы внутри.