Biais CIColorMatrix avec alpha
-
21-12-2019 - |
Question
J'essaie donc de supprimer le canal alpha d'une image.J'ai pensé que j'essaierais CIColorMatrix.Maintenant, voici le problème. filter
est un filtre appliqué précédemment (avec succès).Le code suivant fonctionne comme vous le pensez :
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]];
Il multiplie l'alpha par 0,75.Cependant, si je modifie le biais alpha pour qu'il atteigne 0,01 :
[filter setValue:[CIVector vectorWithX:0 Y:0 Z:0 W:0.01] forKey:@"inputBiasVector"];
le CIImage résultant a des propriétés absurdes extent
, comme environ (-1.7e38, -1.7e38), (3.4e38 x 3.4e38)
.Je n'ai pas essayé de le déplacer pour voir si l'image réelle est correcte.
Quelqu'un sait pourquoi cela se produit et comment y remédier ?
La solution
Ok, je pense que j'ai compris.Apparemment, il n'est pas rare que certains filtres étendent la extent
infiniment.La solution pour cela est de faire
CGRect origExtent = ciImage.extent;
à votre original ciImage
, faire des filtres (réglage ciImage
pour être le résultat à chaque fois), puis appelez
ciImage = [ciImage imageByCroppingToRect:origExtent];
immédiatement avant d'obtenir votre UIImage
ou peu importe.
Autres conseils
Pour supprimer le canal alpha, le filtre correct est Color Clamp, réglant la plage de valeurs alpha sur 1..1 et les autres canaux de couleur sur 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];