Cicormatrix Bias con alfa
-
21-12-2019 - |
Domanda
Quindi sto cercando di rimuovere il canale alfa da un'immagine.Ho pensato che proverei Cicormatrix.Ora, ecco la cosa.filter
è un filtro applicato in precedenza (con successo).Il seguente codice funziona come se pensi che sarebbe:
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]];
.
moltiplica alfa di 0,75.Tuttavia, se cambio il bias alfa per essere così 0,01:
[filter setValue:[CIVector vectorWithX:0 Y:0 Z:0 W:0.01] forKey:@"inputBiasVector"];
.
La ciimage risultante ha extent
prepoteruoto, come circa (-1.7e38, -1.7e38), (3.4e38 x 3.4e38)
.Non ho provato a trasferirlo per vedere se l'immagine effettiva è corretta.
Qualcuno sò perché questo accade e come ripararlo?
Soluzione
OK, penso di averlo capito.Apparentemente non è una cosa non comune per alcuni filtri per estendere il extent
infinitamente.La soluzione per questo è fare
CGRect origExtent = ciImage.extent;
.
Al tuo ciImage
originale, effettuare filtri (impostazione ciImage
per essere il risultato ogni volta), quindi chiamare
ciImage = [ciImage imageByCroppingToRect:origExtent];
.
Immediatamente prima di ottenere il tuo UIImage
finale o qualsiasi altra cosa.
Altri suggerimenti
Per rimuovere il canale alfa il filtro corretto è il morsetto di colore che imposta l'intervallo del valore alfa su 1..1 e gli altri canali di colore 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];
.