Estou tentando mudar a cor do UIImage. Meu código:
-(UIImage *)coloredImage:(UIImage *)firstImage withColor:(UIColor *)color {
UIGraphicsBeginImageContext(firstImage.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[color setFill];
CGContextTranslateCTM(context, 0, firstImage.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextSetBlendMode(context, kCGBlendModeCopy);
CGRect rect = CGRectMake(0, 0, firstImage.size.width, firstImage.size.height);
CGContextDrawImage(context, rect, firstImage.CGImage);
CGContextClipToMask(context, rect, firstImage.CGImage);
CGContextAddRect(context, rect);
CGContextDrawPath(context,kCGPathElementMoveToPoint);
UIImage *coloredImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return coloredImg;
}
Este código funciona, mas a imagem obtida não é tão boa quanto deveria ser: os pixels dos limites da imagem retornada são intermitentes e não tão suaves como na minha primeira imagem. Como posso resolver esse problema?
Respostas:
Desde o iOS 7, esta é a maneira mais simples de fazer isso.
Objective-C:
Swift 2.0:
Swift 4.0:
Storyboard:
Primeiro configure a imagem como modelo (na barra direita - Renderizar como) em seus ativos. Então, a cor da imagem seria a cor da tonalidade aplicada.
fonte
theImageView.image? = (theImageView.image?.imageWithRenderingMode(.AlwaysTemplate))! theImageView.tintColor = UIColor.magentaColor()
img = [img imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; [button setTintColor:[UIColor redColor]]; [button setImage:img forState:UIControlStateNormal];
@Ankish obrigado!Essa é praticamente a resposta acima, mas um pouco abreviada. Isso apenas considera a imagem como uma máscara e não "multiplica" ou colore a imagem.
Objetivo C:
Rápido:
fonte
UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
porque sua versão criará apenas gráficos não retina.Outra maneira de colorir uma imagem é simplesmente multiplicá-la por uma cor constante. Às vezes, isso é preferível porque não "levanta" os valores das cores nas áreas pretas; ele mantém as intensidades relativas na imagem iguais. Usar uma sobreposição como matiz tende a nivelar o contraste.
Este é o código que uso:
Versão rápida
fonte
Em Swift 3.0
Em Swift 2.0
Desfrute de vocês, pioneiros do Swift
fonte
Solução Swift 4.2
fonte
A partir do iOS 10, você pode usar
UIGraphicsImageRenderer
:fonte
Se você não tem que fazer isso programaticamente, você pode simplesmente fazer usando a IU do Xcode.
Se você for para a imagem em sua pasta de recursos de imagem, abra o inspetor no lado direito e há um menu suspenso "Renderizar como" com as seguintes opções:
Depois de fazer a seleção do modelo, você pode alterar o tintColor da imagem como quiser - seja usando a interface de usuário do storyboard do Xcode ou programaticamente.
Veja esta imagem:
fonte
Aqui está minha adaptação da resposta de @Anna. Dois pontos-chave aqui:
destinationIn
modo de misturaUIGraphicsBeginImageContextWithOptions(backgroundSize, false, UIScreen.main.scale)
para obter uma imagem suaveCódigo em Swift 3 :
fonte
self
dentro do seu método e remover o parâmetro de imagem desnecessárioCom base na resposta de @Anna, eu reescrevo para o Swift 2.2 e lida com a imagem com canal alfa:
fonte
O código de Anna funciona bem para copiar um UIImage.image sobre um fundo colorido .image usando kCGBlendModeNormal em vez de kCGBlendModeMultiply. Por exemplo,
self.mainImage.image = [self NormalImageByConstantColor: self.mainImage.image withColor: yourColor];
colocará o conteúdo de mainImage.image sobre a tonalidade de sua cor enquanto preserva a opacidade de sua cor. Isso resolveu meu problema de colocar uma cor de fundo com opacidade atrás de uma imagem a ser salva no rolo da câmera.fonte
Swift 3:
fonte
Versão Swift 3.0 do código maravilhoso de Anna:
fonte
Para iOS 13 e mais recente:
let redImage = image.withTintColor(.red, renderingMode: .alwaysTemplate)
fonte