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?

Foi útil?

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];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top