Как тонировать изображение / показать цвет? - PullRequest
5 голосов
/ 28 февраля 2011

2 вещи, которые я хочу сделать, которые связаны:

  1. Показать блок любого цвета.Так что я могу изменить этот цвет на что-то другое в любое время.
  2. Подкрасьте UIImage, чтобы он был другого цвета.Здесь может работать наложение цвета с выключенной альфа-версией, но, скажем, это было изображение с прозрачным фоном и не занимало весь квадрат изображения.

Есть идеи?

Ответы [ 5 ]

11 голосов
/ 21 мая 2011

Другой вариант - использовать методы категорий в UIImage, как это ...

// Tint the image, default to half transparency if given an opaque colour.
- (UIImage *)imageWithTint:(UIColor *)tintColor {
    CGFloat white, alpha;
    [tintColor getWhite:&white alpha:&alpha];
    return [self imageWithTint:tintColor alpha:(alpha == 1.0 ? 0.5f : alpha)];
}

// Tint the image
- (UIImage *)imageWithTint:(UIColor *)tintColor alpha:(CGFloat)alpha {

    // Begin drawing
    CGRect aRect = CGRectMake(0.f, 0.f, self.size.width, self.size.height);
    UIGraphicsBeginImageContext(aRect.size);

    // Get the graphic context
    CGContextRef c = UIGraphicsGetCurrentContext(); 

    // Converting a UIImage to a CGImage flips the image, 
    // so apply a upside-down translation
    CGContextTranslateCTM(c, 0, self.size.height); 
    CGContextScaleCTM(c, 1.0, -1.0);

    // Draw the image
    [self drawInRect:aRect];

    // Set the fill color space
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextSetFillColorSpace(c, colorSpace);

    // Set the mask to only tint non-transparent pixels
    CGContextClipToMask(c, aRect, self.CGImage);

    // Set the fill color
    CGContextSetFillColorWithColor(c, [tintColor colorWithAlphaComponent:alpha].CGColor);

    UIRectFillUsingBlendMode(aRect, kCGBlendModeColor);

    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();    

    // Release memory
    CGColorSpaceRelease(colorSpace);

    return img;
}
10 голосов
/ 28 февраля 2011

Первое легко. Создайте новый UIView и установите цвет фона на тот, который вам больше нравится.

Второй сложнее. Как вы упомянули, вы можете поместить новый вид поверх него с отключенной прозрачностью, но для того, чтобы закрепить его в тех же местах, вам нужно использовать маску. Примерно так:

UIImage *myImage = [UIImage imageNamed:@"foo.png"];

UIImageView *originalImageView = [[UIImageView alloc] initWithImage:myImage];
[originalImageView setFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
[parentView addSubview:originalImageView];

UIView *overlay = [[UIView alloc] initWithFrame:[originalImageView frame]];

UIImageView *maskImageView = [[UIImageView alloc] initWithImage:myImage];
[maskImageView setFrame:[overlay bounds]];

[[overlay layer] setMask:[maskImageView layer]];

[overlay setBackgroundColor:[UIColor redColor]];

[parentView addSubview:overlay];

Имейте в виду, что вам нужно будет #import <QuartzCore/QuartzCore.h> в файле реализации.

4 голосов
/ 14 сентября 2013

Вот еще один способ реализовать тонирование изображения, особенно если вы уже используете QuartzCore для чего-то другого.

Импорт QuartzCore:

#import <QuartzCore/QuartzCore.h>    

Создайте прозрачный CALayer и добавьте его в качестве подслоя.для изображения, которое вы хотите подкрасить:

CALayer *sublayer = [CALayer layer];
[sublayer setBackgroundColor:[UIColor whiteColor].CGColor];
[sublayer setOpacity:0.3];
[sublayer setFrame:toBeTintedImage.frame];
[toBeTintedImage.layer addSublayer:sublayer];

Добавьте QuartzCore в список Framework вашего проекта (если его там еще нет), в противном случае вы получите такие ошибки компилятора, как:

Undefined symbols for architecture i386: "_OBJC_CLASS_$_CALayer"
2 голосов
/ 28 февраля 2011

Простой способ достижения 1 - создать UILabel или даже UIView и изменить backgroundColor, как вам нравится.

Существует способ умножения цветов вместо простого их наложения, и это должно работать для 2. См. это руководство .

0 голосов
/ 17 декабря 2012

Попробуйте это

   - (void)viewDidLoad
    {
        [super viewDidLoad];
        UIView* maskedView = [self filledViewForPNG:[UIImage imageNamed:@"mask_effect.png"]
                                               mask:[UIImage imageNamed:@"mask_image.png"]
                                          maskColor:[UIColor colorWithRed:.6 green:.2 blue:.7 alpha:1]];


        [self.view addSubview:maskedView];

    }

    -(UIView*)filledViewForPNG:(UIImage*)image mask:(UIImage*)maskImage maskColor:(UIColor*)maskColor
    {
        UIImageView *pngImageView = [[UIImageView alloc] initWithImage:image];
        UIImageView *maskImageView = [[UIImageView alloc] initWithImage:maskImage];

        CGRect bounds;
        if (image) {
            bounds = pngImageView.bounds;
        }
        else
        {
            bounds = maskImageView.bounds;
        }
        UIView* parentView = [[UIView alloc]initWithFrame:bounds];
        [parentView setAutoresizesSubviews:YES];
        [parentView setClipsToBounds:YES];

        UIView *overlay = [[UIView alloc] initWithFrame:bounds];
        [[overlay layer] setMask:[maskImageView layer]];
        [overlay setBackgroundColor:maskColor];

        [parentView addSubview:overlay];
        [parentView addSubview:pngImageView];
        return parentView;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...