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 ?

Était-ce utile?

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];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top