Eu gostaria de colorir uma imagem com uma referência de cor. Os resultados devem ser semelhantes ao modo de mesclagem Multiply no Photoshop, onde os brancos seriam substituídos por matiz :
Eu estarei mudando o valor da cor continuamente.
Acompanhamento: Eu colocaria o código para fazer isso no método drawRect: do meu ImageView, certo?
Como sempre, um trecho de código ajudaria muito no meu entendimento, ao contrário de um link.
Atualização: Subclassificação de um UIImageView com o código sugerido por Ramin .
Eu coloquei isso em viewDidLoad: do meu controlador de visualização:
[self.lena setImage:[UIImage imageNamed:kImageName]];
[self.lena setOverlayColor:[UIColor blueColor]];
[super viewDidLoad];
Eu vejo a imagem, mas não está sendo tingida. Também tentei carregar outras imagens, definindo a imagem no IB e chamando setNeedsDisplay: no meu controlador de visualização.
Update : drawRect: não está sendo chamado.
Atualização final: encontrei um projeto antigo que tinha um imageView configurado corretamente para que eu pudesse testar o código do Ramin e funciona perfeitamente!
Atualização final, final:
Para aqueles que estão aprendendo sobre Core Graphics, aqui está a coisa mais simples que poderia funcionar.
Em seu UIView subclasse:
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColor(context, CGColorGetComponents([UIColor colorWithRed:0.5 green:0.5 blue:0 alpha:1].CGColor)); // don't make color too saturated
CGContextFillRect(context, rect); // draw base
[[UIImage imageNamed:@"someImage.png"] drawInRect: rect blendMode:kCGBlendModeOverlay alpha:1.0]; // draw image
}
fonte
Respostas:
Primeiro, você deseja criar uma subclasse de UIImageView e substituir o método drawRect. Sua classe precisa de uma propriedade UIColor (vamos chamá-la de overlayColor) para conter a cor de mesclagem e um configurador personalizado que força um redesenho quando a cor muda. Algo assim:
No método drawRect, você desejará desenhar a imagem primeiro e, em seguida, sobrepô-la com um retângulo preenchido com a cor desejada, juntamente com o modo de mesclagem adequado, algo como este:
Normalmente, para otimizar o desenho, você restringiria o desenho real apenas à área passada para drawRect, mas como a imagem de fundo deve ser redesenhada cada vez que a cor muda, é provável que tudo precise ser atualizado.
Para usá-lo, crie uma instância do objeto e defina a
image
propriedade (herdada de UIImageView) para a imagem eoverlayColor
um valor UIColor (os níveis de mesclagem podem ser ajustados alterando o valor alfa da cor que você passa).fonte
No iOS7, eles introduziram a propriedade tintColor em UIImageView e renderingMode em UIImage. Para colorir um UIImage no iOS7, tudo que você precisa fazer é:
fonte
Eu queria tingir uma imagem com alfa e criei a seguinte classe. Por favor, deixe-me saber se você encontrar algum problema com isso.
Eu nomeei minha classe
CSTintedImageView
e ela herda deUIView
uma vezUIImageView
que não chama odrawRect:
método, como mencionado nas respostas anteriores. Eu configurei um inicializador designado semelhante ao encontrado naUIImageView
classe.Uso:
CSTintedImageView.h
CSTintedImageView.m
fonte
Apenas um rápido esclarecimento (após algumas pesquisas sobre o assunto). O documento da Apple aqui afirma claramente que:
então nem perca tempo tentando sobrescrever esse método em uma
UIImageView
subclasse. EmUIView
vez disso, comece com .fonte
Isso pode ser muito útil: PhotoshopFramework é uma biblioteca poderosa para manipular imagens em Objective-C. Ele foi desenvolvido para trazer as mesmas funcionalidades que os usuários do Adobe Photoshop estão familiarizados. Exemplos: definir cores usando RGB 0-255, aplicar filtros de mistura, transformações ...
É código aberto, aqui está o link do projeto: https://sourceforge.net/projects/photoshopframew/
fonte
fonte
Aqui está outra maneira de implementar o tingimento de imagem, especialmente se você já estiver usando o QuartzCore para outra coisa. Esta foi a minha resposta para uma pergunta semelhante .
Importar QuartzCore:
Crie CALayer transparente e adicione-o como uma subcamada para a imagem que você deseja colorir:
Adicione QuartzCore à lista de frameworks de seus projetos (se ainda não estiver lá), caso contrário, você obterá erros de compilador como este:
fonte
Para aqueles de vocês que tentam criar uma subclasse de uma classe UIImageView e ficam presos em "drawRect: não está sendo chamado", observe que você deve criar uma subclasse de uma classe UIView, porque para classes UIImageView, o método "drawRect:" não é chamado. Leia mais aqui: drawRect não sendo chamado em minha subclasse de UIImageView
fonte
A única coisa que posso pensar seria em criar uma visualização retangular quase transparente com a cor desejada e colocá-la sobre a visualização da imagem adicionando-a como uma subvisualização. Não tenho certeza se isso realmente tingirá a imagem da maneira que você imagina, porém, não tenho certeza de como você invadiria uma imagem e seletivamente substituir certas cores por outras ... parece muito ambicioso para mim.
Por exemplo:
Documentação para UIColor:
fonte
Além disso, você pode querer considerar o armazenamento em cache da imagem composta para desempenho e apenas renderizá-la em drawRect :, em seguida, atualizá-la se um sinalizador sujo estiver realmente sujo. Embora você possa alterá-lo com frequência, pode haver casos em que os empates estão chegando e você não está sujo, então você pode simplesmente atualizar do cache. Se a memória é mais um problema do que o desempenho, você pode ignorar isso :)
fonte
Eu tenho uma biblioteca que abri para isso: ios-image-filters
fonte
Para Swift 2.0,
fonte
Fiz macros para este propósito:
Para usar, basta ligar:
Ao remover a tinta, basta chamar:
fonte