Pregunta

Entonces estoy intentando eliminar el canal alfa de una imagen.Pensé en probar CIColorMatrix.Ahora, aquí está la cuestión. filter es un filtro aplicado previamente (con éxito).El siguiente código funciona como crees:

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.Sin embargo, si cambio el sesgo alfa para que sea de hasta 0,01:

[filter setValue:[CIVector vectorWithX:0 Y:0 Z:0 W:0.01] forKey:@"inputBiasVector"];

el CIImage resultante tiene absurdo extent, como aproximadamente (-1.7e38, -1.7e38), (3.4e38 x 3.4e38).No he intentado reubicarlo para ver si la imagen real es correcta.

¿Alguien sabe por qué sucede esto y cómo solucionarlo?

¿Fue útil?

Solución

Ok, creo que lo descubrí.Aparentemente no es raro que algunos filtros extiendan el tiempo extent infinitamente.La solución para eso es hacer

CGRect origExtent = ciImage.extent;

a tu original ciImage, hacer filtros (configurar ciImage para ser el resultado cada vez), y luego llamar

ciImage = [ciImage imageByCroppingToRect:origExtent];

inmediatamente antes de obtener su final UIImage o lo que sea.

Otros consejos

Para eliminar el canal alfa El filtro correcto es la abrazadera de color Configuración del rango de valor alfa a 1..1 y los otros canales de color a 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top