iPhone - Как вы окрашиваете изображение?

Я хотел бы знать, как раскрасить изображение (например, сделать белый .png красным). Я видел различные предложения, но никогда не подтверждал, что это действительно возможно. Я попробовал это:

-(UIImage *)colorizeImage:(UIImage *)baseImage color:(UIColor *)theColor {
    UIGraphicsBeginImageContext(baseImage.size);

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGRect area = CGRectMake(0, 0, baseImage.size.width, baseImage.size.height);

    CGContextScaleCTM(ctx, 1, -1);
    CGContextTranslateCTM(ctx, 0, -area.size.height);
    CGContextSaveGState(ctx);
    CGContextClipToMask(ctx, area, baseImage.CGImage);
    [theColor set];
    CGContextFillRect(ctx, area);
    CGContextRestoreGState(ctx);
    CGContextSetBlendMode(ctx, kCGBlendModeNormal);
    CGContextDrawImage(ctx, area, baseImage.CGImage);
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

myImageView.image = [self colorizeImage:[UIImage imageNamed:@"whiteImage.png"] color:[UIColor redColor]];

Но это не работает - изображение все еще белое на экране.

 Shrawan14 дек. 2016 г., 18:55
Можете сослатьсяstackoverflow.com/questions/19274789/…
 Amagrammer03 авг. 2009 г., 18:56
Но что именно вы пытаетесь сделать? Вы пытаетесь превратить все пиксели, которые полностью белые (RGB (255,255,255)), в красный? Вы просто хотите добавить красный оттенок? Является ли ваш & quot; whiteImage.png & quot; на самом деле просто большой прямоугольник всего белого?
 sol03 авг. 2009 г., 19:15
Да, я хочу превратить белые (или серые) пиксели в красные. Прозрачная часть png должна оставаться прозрачной. whiteImage.png - это не белый прямоугольник, это, например, изображение животного.
 Amagrammer03 авг. 2009 г., 19:56
Есть ли конкретная причина, по которой вы не можете просто иметь красную версию одного и того же изображения и переключаться между ними по мере необходимости? Двухцветные изображения сжимаются очень мало.

Ответы на вопрос(9)

Сначала вы рисуете цвет, а затем рисуете его поверх него. Если изображение не является частично прозрачным, оно полностью заменит цвет фона. Я рекомендую сначала нарисовать исходное изображение, а затем нарисовать красным поверх него, используяkCGBlendModeHue.

Я не уверен, почему вы переворачиваете и переводите свой контекст. Ваша картинка перевернута?

Начиная с iOS 7, вы можете подкрашивать изображения одним цветом

Objective C

UIImage *image = [UIImage imageNamed:@"myImage.png"];
UIImageView *imageView = [[UIImageView alloc]initWithImage:[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]];
imageView.tintColor = [UIColor redColor];

Swift 3

let image = UIImage(named:"myImage.png")?.withRenderingMode(.alwaysTemplate)
let imageView = UIImageView(image:image)
imageView.tintColor = .red

Это закрасит все изображение одним цветом и сохранит альфа-канал.

 29 июн. 2015 г., 13:21
это прекрасно работает, спасибо!

Сделайте эту категорию UIImage. Также учитывается масштабный коэффициент с iOS 4.

- (UIImage *)imageWithOverlayColor:(UIColor *)color
{        
    CGRect rect = CGRectMake(0.0f, 0.0f, self.size.width, self.size.height);

    if (UIGraphicsBeginImageContextWithOptions) {
        CGFloat imageScale = 1.0f;
        if ([self respondsToSelector:@selector(scale)])  // The scale property is new with iOS4.
            imageScale = self.scale;
        UIGraphicsBeginImageContextWithOptions(self.size, NO, imageScale);
    }
    else {
        UIGraphicsBeginImageContext(self.size);
    }

    [self drawInRect:rect];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(context, kCGBlendModeSourceIn);

    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextFillRect(context, rect);

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

    return image;
}

UPDATE - Swift версия:

func imageWithColor(color: UIColor) -> UIImage {
    let rect = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height)
    UIGraphicsBeginImageContextWithOptions(self.size, false, 0.0);
    drawInRect(rect)
    let context = UIGraphicsGetCurrentContext()
    CGContextSetBlendMode(context, .SourceIn)
    CGContextSetFillColorWithColor(context, color.CGColor)
    CGContextFillRect(context, rect);
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
}
 23 мар. 2011 г., 15:44
Спасибо за это ... именно то, что мне нужно, чтобы раскрасить фон интерфейсной функции, основываясь на выбранной пользователем теме.
 27 янв. 2013 г., 12:33
+1 Спасибо, это сработало для меня. Раньше я получал только белый цвет, теперь {CGContextSetBlendMode (ctx, kCGBlendModeMultiply);}, как сказал willc2, работает нормально.
 26 февр. 2015 г., 12:51
Это простое решение для iOS7 +, см.stackoverflow.com/a/27356928/3624478
 07 окт. 2011 г., 10:51
Это сработало и для меня :)
 01 февр. 2013 г., 12:44
Однажды утром, чтобы найти это ... И это было так просто! Я люблю тебя, Дэйв Балтон.

Я думаю, что лучший способ раскрасить изображение из iOS7, указав свойствоUIImageRenderingModeAlwaysTemplate на вашем изображении:

myImageView.image = [[UIImage imageNamed:@"myImage"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

а затем раскрасить его с помощью tintColor imageView

myImageView.tintColor = [UIColor purpleColor]; //Maybe purple is not the best choice ;)

Я думаю, что это проще (без категории) и, конечно, оптимизировано!

Примечание: если вы используете xcassets, вы можете установить свойство рендеринга вUIImageRenderingModeAlwaysTemplate в XCode, как на этом скриншоте:

UIImageRenderingModeAlwaysTemplate in XCode

Короче, сладко и лучше :)

- (UIImage *)colorizeImage:(UIImage *)image withColor:(UIColor *)color

определятьUIColorFromRGB использовать шестнадцатеричные цветовые коды, тогда просто позвонитеcolorizeImage:withColor

#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

- (void)viewDidLoad
{
    [super viewDidLoad];
    UIImage *imgToColor = [UIImage imageNamed:@"myImage.png"];
    imgToColor = [self colorizeImage:imgToColor withColor:UIColorFromRGB(0xff00ff)];
    // use normal UIColor or UIColorFromRGB() for hex
}

 - (UIImage *)colorizeImage:(UIImage *)image withColor:(UIColor *)color
{
    CGRect rect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height);
    UIGraphicsBeginImageContextWithOptions(image.size, NO, [[UIScreen mainScreen] scale]);
    [image drawInRect:rect];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(context, kCGBlendModeSourceIn);

    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextFillRect(context, rect);

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

@ малыш, дай мне знать, если это поможет тебе, чувак ...

// translate/flip the graphics context (for transforming from CG* coords to UI* coords)
CGContextTranslateCTM(context, 0, img.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

// заменить & quot; контекст & quot; сUIGraphicsGetCurrentContext() или если у вас есть экземпляр текущего контекста.

Надеюсь, это поможет.

Хорошо, как это?

На этапе создания вашего ресурса (НЕ динамически во время работы приложения) инвертируйте цветовую схему ваших изображений. Часть, которая теперь белая - & gt; прозрачный. Часть, которая теперь прозрачна - & gt; какой бы ни был фон страницы.

Под каждым изображением поместите пустой белый вид того же размера. Если вы хотите превратить изображение в красное, измените цвет этого пустого белого вида на красный.

Это выполнимо?

Если вы установите backgroundColor UIImageView в [UIColor redColor], части исходного PNG, которые былиtransparent станет красным. В качестве альтернативы, вы можете попробовать добавить полупрозрачный UIView с красным цветом фона в качестве подпредставления изображения. Это добавит красную дымку к представлению, отображающему изображение.

 03 авг. 2009 г., 19:16
Спасибо, но я хочу покрасить только пиксели, а не весь прямоугольник.

Измените режим смешивания наmultiply и ваш код будет работать:

CGContextSetBlendMode(ctx, kCGBlendModeMultiply);
 27 янв. 2013 г., 12:27
+1 Спасибо, это сработало для меня. Раньше я получал только белый цвет, теперь он работает нормально.

Ваш ответ на вопрос