Подтвердить что ты не робот

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]];

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

4b9b3361

Ответ 1

Сделайте это категорией 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
}

Ответ 2

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

CGContextSetBlendMode(ctx, kCGBlendModeMultiply);

Ответ 3

Как и в iOS 7, вы можете оттенять изображения одним цветом таким образом

Цель 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

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

Ответ 4

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

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

а затем раскрасить его цветом tintColor изображенияView

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

Мне кажется, что это проще (нет необходимости в категории) и, конечно же, оптимизировано!

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

UIImageRenderingModeAlwaysTemplate in XCode

Ответ 5

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

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

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

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

Ответ 6

@geek kid, дайте мне знать, если это поможет u dude...

// 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);

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

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

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