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?

È stato utile?

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];
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top