69 votes

Comment convertir une image UIImage en image CIImage et inversement ?

J'essaie d'obtenir CIImage d'ImageView qui s'affichent à l'écran.

UIImage *image = myImageView.image;

convertir l'image UIImage a CIImage .

CIImage *cImage = [....];

Comment faire ?

132voto

changx Points 849
CIImage *ciImage = [UIImage imageNamed:@"test.png"].CIImage;
UIImage *uiImage = [[UIImage alloc] initWithCIImage:ciImage];

Pour résoudre le cas où myUIImage.CIImage renvoie à nil comme [UIImageView image] vous pouvez plutôt faire [CIImage imageWithCGImage:myUIImage.CGImage] - Dylan Hand

Version Swift :

let ciImage = UIImage(named: "test.png")!.ciImage
let uiImage = UIImage(ciImage: ciImage)

Pour résoudre le cas où myUIImage.ciImage renvoie à nil comme vous pouvez le faire à la place CIImage(cgImage: myUIImage!.cgImage!) .

31voto

Chris Vander Mey Points 211

Bien que la réponse de Changxing Wang soit effectivement correcte, Apple indique que UIImage.CIImage ne fonctionnera pas toujours. Plus précisément, à partir de PocketCoreImage :

// Create a CIImage from the _inputImage.  While UIImage has a property returning
// a CIImage representation of it, there are cases where it will not work.  This is the
// most compatible route.
_filteredImage = [[CIImage alloc] initWithCGImage:_inputImage.CGImage options:nil];

Apple utilise également la méthode suivante, qui ne fonctionne pas pour moi :

[UIImage imageWithCIImage:_filteredImage] 

Ma mise en œuvre personnelle, adaptée de ce poste fonctionne pour moi :

// result is a CIImage, output of my filtering.  
// returnImage is (obviously) a UIImage that I'm going to return.
CIContext *context = [CIContext contextWithOptions:nil];
UIImage *returnImage = 
[UIImage imageWithCGImage:[context createCGImage:result fromRect:result.extent]];

23voto

Juraj Antas Points 559

C'est la façon la plus compatible de le faire :

UIImage* u =[UIImage imageNamed:@"image.png"];
CIImage* ciimage = [[CIImage alloc] initWithCGImage:u.CGImage];

utilise maintenant ciimage...

et la version Swift :

let i1 = UIImage(named: "testImage")
if let cgi1 = i1?.cgImage {
   let ci = CIImage(cgImage: cgi1)
   //use ci
}

(correction d'une coquille dans l'instruction if let)

13voto

JVillella Points 68

Voici un exemple complet de code que j'ai utilisé dans mes projets.

- (UIImage *)makeUIImageFromCIImage:(CIImage *)ciImage {
    CIContext *context = [CIContext contextWithOptions:nil];
    CGImageRef cgImage = [context createCGImage:ciImage fromRect:[ciImage extent]];

    UIImage* uiImage = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);

    return uiImage;
}

CIImage est en fait une recette pour une image. Vous rencontrerez des problèmes si vous essayez de convertir directement de CIImage a UIImage . Par exemple, en appelant

NSData * UIImageJPEGRepresentation (
   UIImage *image,
   CGFloat compressionQuality
);

retournera nil .

12voto

Etan Points 4436
func toCIImage(image: UIImage) -> CIImage {
    return image.CIImage ?? CIImage(CGImage: image.CGImage!)
}

func toUIImage(image: CIImage) -> UIImage {
    return UIImage(CIImage: image)
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X