Для этого вы можете использовать CoreImage
фреймворк.
Я могу показать вам, как это сделать в Objective-C, поэтому надеюсь, что это поможет. У вас должна быть возможность перевести его на swift, или вы можете просто использовать его напрямую, используя заголовок моста.
Сначала вам понадобится для создания CoreImage
контекста. Лучше всего один раз инициализировать его, поэтому сохраните ссылку на него со свойством:
@property (strong, nonatomic) CIContext *ciContext;
...
self.ciContext = [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer : @NO}];
Теперь самое интересное - использование фильтра CIColorMatrix
для сдвига белого. Вот метод, который делает именно это (обратите внимание, что он использует ciContext, который мы создали ранее):
-(UIImage*)filteredImageFromImage:(UIImage*)sourceImage withColor:(UIColor*)color
{
size_t componentCount = CGColorGetNumberOfComponents(color.CGColor);
if (componentCount < 4)
{
return sourceImage;
}
CIImage *inputCIImage = [CIImage imageWithCGImage:sourceImage.CGImage];
CGRect extent = [inputCIImage extent];
CGFloat r, g, b, a;
[color getRed:&r green:&g blue:&b alpha:&a];
CIFilter *colorMatrixFilter = [CIFilter filterWithName:@"CIColorMatrix"];
[colorMatrixFilter setDefaults];
[colorMatrixFilter setValue:inputCIImage forKey:kCIInputImageKey];
[colorMatrixFilter setValue:[CIVector vectorWithX:r Y:0 Z:0 W:0] forKey:@"inputRVector"];
[colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:g Z:0 W:0] forKey:@"inputGVector"];
[colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:0 Z:b W:0] forKey:@"inputBVector"];
CGImageRef cgiimage = [self.ciContext createCGImage:colorMatrixFilter.outputImage fromRect:extent];
UIImage *newImage = [UIImage imageWithCGImage:cgiimage scale:[[UIScreen mainScreen] scale] orientation:sourceImage.imageOrientation];
CGImageRelease(cgiimage);
return newImage;
}
Наконец, чтобы окрасить карту в желтый цвет:
UIImage *cardImage = [self filteredImageFromImage:[UIImage imageNamed:@"card"] withColor:[UIColor yellowColor]];
Изменить:
Вот как быстро использовать его с заголовком моста:
- Добавьте новый класс Objective-C. Назовем его ImageFilter.
Заголовочный файл:
// ImageFilter.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface ImageFilter : NSObject
-(UIImage*)filteredImageFromImage:(UIImage*)sourceImage withColor:(UIColor*)color;
@end
Файл реализации:
// ImageFilter.m
#import "ImageFilter.h"
#import <CoreImage/CoreImage.h>
@interface ImageFilter()
@property (strong, nonatomic) CIContext *ciContext;
@end
@implementation ImageFilter
- (instancetype)init
{
self = [super init];
if (self != nil)
{
self.ciContext = [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer : @NO}];
}
return self;
}
-(UIImage*)filteredImageFromImage:(UIImage*)sourceImage withColor:(UIColor*)color
{
size_t componentCount = CGColorGetNumberOfComponents(color.CGColor);
if (componentCount < 4)
{
return sourceImage;
}
CIImage *inputCIImage = [CIImage imageWithCGImage:sourceImage.CGImage];
CGRect extent = [inputCIImage extent];
CGFloat r, g, b, a;
[color getRed:&r green:&g blue:&b alpha:&a];
CIFilter *colorMatrixFilter = [CIFilter filterWithName:@"CIColorMatrix"];
[colorMatrixFilter setDefaults];
[colorMatrixFilter setValue:inputCIImage forKey:kCIInputImageKey];
[colorMatrixFilter setValue:[CIVector vectorWithX:r Y:0 Z:0 W:0] forKey:@"inputRVector"];
[colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:g Z:0 W:0] forKey:@"inputGVector"];
[colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:0 Z:b W:0] forKey:@"inputBVector"];
CGImageRef cgiimage = [self.ciContext createCGImage:colorMatrixFilter.outputImage fromRect:extent];
UIImage *newImage = [UIImage imageWithCGImage:cgiimage scale:[[UIScreen mainScreen] scale] orientation:sourceImage.imageOrientation];
CGImageRelease(cgiimage);
return newImage;
}
@end
В вашем файле моста (обычно YourProject-Bridging-Header.h, который Xcode запросит и создаст автоматически, когда вы добавите новый файл Objective-C в свой проект) импортируйте наш новый файл:
#import ImageEffect.h
Кроме того, не забудьте убедиться, что «YourProject-Bridging-Header.h» указан в «Заголовке моста Objective-C» в настройках вашей целевой сборки.
Используйте его в своем быстром коде:
пусть imageFilter: ImageFilter = ImageFilter ()
let cardImage = imageFilter.filteredImageFromImage(UIImage(named: "card"), withColor: UIColor.yellowColor());
Примечание: форматирование кода меня немного помешало, не знаю почему. Это приводит к тому, что последний бит кода быстро не отображается как блок кода должным образом ...
person
Artal
schedule
14.01.2016
self.tintColor = CardView.TINT_COLOR
? - person kostek   schedule 14.01.2016