iPhone – Como você colore uma imagem?

Eu adoraria saber como colorir uma imagem (fazer um branco .png vermelho, por exemplo). Eu vi várias sugestões, mas nunca qualquer confirmação de que isso é realmente possível. Eu tentei isso:

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

Mas isso não funciona – a imagem ainda está branca na canvas.

Faça disso uma categoria UIImage. Também leva em conta o fator de escala com o 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; } 

ATUALIZAÇÃO – Versão 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 } 

Altere seu modo de mesclagem para multiplicar e seu código funcionará:

 CGContextSetBlendMode(ctx, kCGBlendModeMultiply); 

A partir do iOS 7, você pode colorir imagens com uma única cor

Objetivo 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 

Isso irá colorir uma imagem inteira com uma única cor e preservar o canal alfa.

Acho que a melhor maneira de colorir uma imagem do iOS7 é especificando a propriedade UIImageRenderingModeAlwaysTemplate na sua imagem:

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

e depois colori-lo com o tintColor da imageView

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

Eu acho que é mais fácil (nenhuma categoria necessária) e, claro, otimizada!

Nota: se você estiver usando xcassets, você pode definir a propriedade de renderização para UIImageRenderingModeAlwaysTemplate no XCode, como nesta captura de canvas:

UIImageRenderingModeAlwaysTemplate no XCode

Ok, como vai isso?

Em sua fase de criação de ativos (NÃO dinamicamente enquanto o aplicativo está em execução), inverta o esquema de colors de suas imagens. Parte que agora é branca -> transparente. Parte que agora é transparente -> qualquer que seja o plano de fundo da página.

Em cada imagem, coloque uma vista branca em branco do mesmo tamanho. Quando você deseja transformar a imagem em vermelho, altere a cor da exibição em branco para vermelho.

Isso é factível?

@geek garoto, me avise se isso te ajuda cara …

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

// substitua “context” por UIGraphicsGetCurrentContext() ou se você tiver uma instância do contexto atual.

Espero que ajude.

Curta, doce e melhor 🙂

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

Definir UIColorFromRGB para usar códigos de colors hexadecimais, em seguida, basta chamar 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; } 

Se você definir o backgroundColor de um UIImageView para [UIColor redColor], as partes do PNG original que forem transparentes ficarão vermelhas. Como alternativa, você pode tentar adicionar um UIView semitransparente com a cor de plano de fundo vermelha como subvisualização da visualização de imagem. Isso adicionará uma névoa vermelha à exibição da imagem.

Você está desenhando a cor primeiro e depois desenhando a imagem em cima dela. A menos que a imagem seja parcialmente transparente, vai retirar completamente a cor do plano de fundo. Eu recomendo tentar desenhar a imagem original primeiro e, em seguida, desenhar vermelho sobre ela usando kCGBlendModeHue .

Não sei por que você está mudando e traduzindo seu contexto. Sua foto está de cabeça para baixo?

    Intereting Posts