CIColorMatrix preconceito com alpha
-
21-12-2019 - |
Pergunta
Então, eu estou tentando remover o canal alfa a partir de uma imagem.Pensei em tentar CIColorMatrix.Agora, aqui está a coisa. filter
é um anteriormente (com êxito) filtro aplicado.O código a seguir funciona como você acha que seria:
ciImage = [filter valueForKey:kCIOutputImageKey];
filter = [CIFilter filterWithName:@"CIColorMatrix"];
[filter setValue:ciImage forKey:kCIInputImageKey];
[filter setValue:[CIVector vectorWithX:1 Y:0 Z:0 W:0] forKey:@"inputRVector"];
[filter setValue:[CIVector vectorWithX:0 Y:1 Z:0 W:0] forKey:@"inputGVector"];
[filter setValue:[CIVector vectorWithX:0 Y:0 Z:1 W:0] forKey:@"inputBVector"];
[filter setValue:[CIVector vectorWithX:0 Y:0 Z:0 W:0.75] forKey:@"inputAVector"];
[filter setValue:[CIVector vectorWithX:0 Y:0 Z:0 W:0.0] forKey:@"inputBiasVector"];
image = [UIImage imageWithCIImage:[filter valueForKey:kCIOutputImageKey]];
Multiplica-alfa por 0,75.No entanto, se eu mudar o alfa viés para ser muito 0.01:
[filter setValue:[CIVector vectorWithX:0 Y:0 Z:0 W:0.01] forKey:@"inputBiasVector"];
a resultante CIImage tem que absurdo extent
, como cerca de (-1.7e38, -1.7e38), (3.4e38 x 3.4e38)
.Eu ainda não tentei colocá-la para ver se a imagem está correta.
Alguém sabe por que isso acontece e como corrigi-lo?
Solução
Ok, eu acho que eu descobri.Aparentemente, não é uma coisa incomum para alguns filtros para alargar a extent
infinitamente.A solução para isso é fazer
CGRect origExtent = ciImage.extent;
original ciImage
, fazer filtros (definição de ciImage
para ser o resultado de cada vez), e, em seguida, chamar
ciImage = [ciImage imageByCroppingToRect:origExtent];
imediatamente antes de obter o seu final UIImage
ou seja o que for.
Outras dicas
Para remover o canal alfa o filtro correto é cor de grampo de definir o valor de alfa intervalo 1..1 e os outros canais de cores para 0..1:
CIFilter *clamp = [CIFilter filterWithName:@"CIColorClamp"];
[clamp setValue:ciImage forKey:kCIInputImageKey];
[clamp setValue:[CIVector vectorWithX:0 Y:0 Z:0 W:1] forKey:@"inputMinComponents"];
[clamp setValue:[CIVector vectorWithX:1 Y:1 Z:1 W:1] forKey:@"inputMaxComponents"];
image = [clamp valueForKey:kCIOutputImageKey];