Я пытаюсь изменить цвет UIImage. Мой код:
-(UIImage *)coloredImage:(UIImage *)firstImage withColor:(UIColor *)color {
UIGraphicsBeginImageContext(firstImage.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[color setFill];
CGContextTranslateCTM(context, 0, firstImage.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextSetBlendMode(context, kCGBlendModeCopy);
CGRect rect = CGRectMake(0, 0, firstImage.size.width, firstImage.size.height);
CGContextDrawImage(context, rect, firstImage.CGImage);
CGContextClipToMask(context, rect, firstImage.CGImage);
CGContextAddRect(context, rect);
CGContextDrawPath(context,kCGPathElementMoveToPoint);
UIImage *coloredImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return coloredImg;
}
Этот код работает, но полученное изображение не так хорошо, как должно быть: границы пикселей возвращаемого изображения прерывистые и не такие гладкие, как на моем первом изображении. Как я могу решить эту проблему?
Ответы:
Начиная с iOS 7, это самый простой способ сделать это.
Цель-C:
Swift 2.0:
Swift 4.0:
Раскадровка:
Сначала настройте изображение как шаблон (на правой панели - «Визуализировать как») в ваших активах. Тогда цвет изображения будет примененным цветом оттенка.
источник
theImageView.image? = (theImageView.image?.imageWithRenderingMode(.AlwaysTemplate))! theImageView.tintColor = UIColor.magentaColor()
img = [img imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; [button setTintColor:[UIColor redColor]]; [button setImage:img forState:UIControlStateNormal];
@Ankish спасибо!Это в значительной степени ответ выше, но немного сокращен. При этом изображение используется только как маска, а не «умножение» или окраска изображения.
Цель C:
Swift:
источник
UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
потому что ваша версия будет создавать только графику без сетчатки.Другой способ тонировать изображение - просто умножить его на постоянный цвет. Иногда это предпочтительнее, потому что это не «увеличивает» значения цвета в черных областях; он сохраняет относительную интенсивность изображения неизменной. Использование наложения в качестве оттенка приводит к сглаживанию контраста.
Вот код, который я использую:
Свифт версия
источник
В Swift 3.0
В Swift 2.0
Удачи вам, пионеры Swift
источник
Swift 4.2 Решение
источник
Начиная с iOS 10 вы можете использовать
UIGraphicsImageRenderer
:источник
Если вам не нужно делать это программно, вы можете просто сделать это с помощью пользовательского интерфейса Xcode.
Если вы перейдете к изображению в папке с изображениями, откройте инспектор справа и увидите раскрывающийся список «Визуализировать как» со следующими параметрами:
После того, как вы сделали выбор шаблона, вы можете изменить tintColor изображения, как хотите - с помощью пользовательского интерфейса раскадровки Xcode или программно.
Смотрите это изображение:
источник
Вот моя адаптация ответа @Anna. Здесь два ключевых момента:
destinationIn
режим наложенияUIGraphicsBeginImageContextWithOptions(backgroundSize, false, UIScreen.main.scale)
чтобы получить плавное изображениеКод в Swift 3 :
источник
self
внутри вашего метода и удалить ненужный параметр изображенияОсновываясь на ответе @Anna, я переписываю для быстрого 2.2 и обрабатывает изображение с альфа-каналом:
источник
Код Анны хорошо подходит для копирования UIImage.image на цветной фон .image с использованием kCGBlendModeNormal, а не kCGBlendModeMultiply. Например,
self.mainImage.image = [self NormalImageByConstantColor: self.mainImage.image withColor: yourColor];
содержимое mainImage.image будет помещено поверх оттенка yourColor, сохраняя при этом непрозрачность yourColor. Это решило мою проблему с размещением цвета фона с непрозрачностью позади изображения, которое нужно сохранить в Camera Roll.источник
Swift 3:
источник
Версия чудесного кода Анны на Swift 3.0:
источник
Для iOS 13 и новее:
let redImage = image.withTintColor(.red, renderingMode: .alwaysTemplate)
источник