Вопрос по image, iphone, colors – iPhone - Как вы окрашиваете изображение?

34

Я хотел бы знать, как раскрасить изображение (например, сделать белый .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]];

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

Есть ли конкретная причина, по которой вы не можете просто иметь красную версию одного и того же изображения и переключаться между ними по мере необходимости? Двухцветные изображения сжимаются очень мало. Amagrammer
Можете сослатьсяstackoverflow.com/questions/19274789/… Shrawan
Да, я хочу превратить белые (или серые) пиксели в красные. Прозрачная часть png должна оставаться прозрачной. whiteImage.png - это не белый прямоугольник, это, например, изображение животного. sol
Но что именно вы пытаетесь сделать? Вы пытаетесь превратить все пиксели, которые полностью белые (RGB (255,255,255)), в красный? Вы просто хотите добавить красный оттенок? Является ли ваш & quot; whiteImage.png & quot; на самом деле просто большой прямоугольник всего белого? Amagrammer

Ваш Ответ

9   ответов
64

Сделайте эту категорию 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
}
+1 Спасибо, это сработало для меня. Раньше я получал только белый цвет, теперь {CGContextSetBlendMode (ctx, kCGBlendModeMultiply);}, как сказал willc2, работает нормально.
Однажды утром, чтобы найти это ... И это было так просто! Я люблю тебя, Дэйв Балтон.
Это простое решение для iOS7 +, см.stackoverflow.com/a/27356928/3624478
Спасибо за это ... именно то, что мне нужно, чтобы раскрасить фон интерфейсной функции, основываясь на выбранной пользователем теме.
Это сработало и для меня :)
0

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

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

1

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

- (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;
}
1

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

// 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() или если у вас есть экземпляр текущего контекста.

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

1

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

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

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

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

12

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

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

Начиная с 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

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

это прекрасно работает, спасибо!
2

Я думаю, что лучший способ раскрасить изображение из 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

0

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

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

Похожие вопросы