Оновлення: Ось суть для розширення Swift UIColor, використовуючи код нижче.
Якщо у вас є зображення в сірих тонах і ви хочете, щоб білий колір став тонуючим кольором , kCGBlendModeMultiply
це шлях. За допомогою цього методу ви не можете мати світлі місця, світліші за кольоровий колір.
Навпаки, якщо у вас є зображення , що не має відтінків сірого , АБО у вас є відблиски та тіні, які слід зберегти, режим накладання kCGBlendModeColor
- це шлях. Білий залишатиметься білим, а чорний залишатиметься чорним у міру збереження легкості зображення. Цей режим створений лише для тонування - він такий самий, як і Color
режим накладання шарів Photoshop (застереження: можуть траплятися дещо інші результати).
Зауважте, що тонування альфа-пікселів не працює належним чином ні в iOS, ні в Photoshop - напівпрозорі чорні пікселі не залишаться чорними. Я оновив відповідь нижче, щоб обійти це питання, і це зайняло досить багато часу, щоб з’ясувати це.
Ви також можете використовувати один із режимів змішування kCGBlendModeSourceIn/DestinationIn
замість CGContextClipToMask
.
Якщо ви хочете створити a UIImage
, кожен з наступних розділів коду може бути оточений таким кодом:
UIGraphicsBeginImageContextWithOptions (myIconImage.size, NO, myIconImage.scale);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0, myIconImage.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGRect rect = CGRectMake(0, 0, myIconImage.size.width, myIconImage.size.height);
UIImage *coloredImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Отже, ось код для тонування прозорого зображення за допомогою kCGBlendModeColor
:
CGContextSetBlendMode(context, kCGBlendModeNormal);
[[UIColor blackColor] setFill];
CGContextFillRect(context, rect);
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextDrawImage(context, rect, myIconImage.CGImage);
CGContextSetBlendMode(context, kCGBlendModeColor);
[tintColor setFill];
CGContextFillRect(context, rect);
CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
CGContextDrawImage(context, rect, myIconImage.CGImage);
Якщо на вашому зображенні немає напівпрозорих пікселів, ви також можете зробити це навпаки за допомогою kCGBlendModeLuminosity
:
CGContextSetBlendMode(context, kCGBlendModeNormal);
[tintColor setFill];
CGContextFillRect(context, rect);
CGContextSetBlendMode(context, kCGBlendModeLuminosity);
CGContextDrawImage(context, rect, myIconImage.CGImage);
CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
CGContextDrawImage(context, rect, myIconImage.CGImage);
Якщо ви не дбаєте про світність, оскільки у вас просто є зображення з альфа-каналом, яке має бути тонованим кольором, ви можете зробити це більш ефективно:
CGContextSetBlendMode(context, kCGBlendModeNormal);
[tintColor setFill];
CGContextFillRect(context, rect);
CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
CGContextDrawImage(context, rect, myIconImage.CGImage);
або навпаки:
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextDrawImage(context, rect, myIconImage.CGImage);
CGContextSetBlendMode(context, kCGBlendModeSourceIn);
[tintColor setFill];
CGContextFillRect(context, rect);
Веселіться!