Question

J'ai beaucoup de mal à trouver une documentation en ligne expliquant clairement comment implémenter correctement le filtre CIPerspectiveTransform de Core Image.En particulier, lors de la définition des valeurs CIVector pour inputTopLeft, inputTopRight, inputBottomRight, et inputBottomLeft, que font ces vecteurs à l'image ?(C'est-à-dire, quel est le calcul derrière la façon dont ces vecteurs déforment mon image ?)

Actuellement, c'est le code que j'utilise.Il ne plante pas, mais il n'affiche pas d'image :

CIImage *myCIImage = [[CIImage alloc] initWithImage:self.image];
CIContext *context = [CIContext contextWithOptions:nil];
CIFilter *filter = [CIFilter filterWithName:@"CIPerspectiveTransform" keysAndValues:@"inputImage", myCIImage, @"inputTopLeft", [CIVector vectorWithX:118 Y:484], @"inputTopRight", [CIVector vectorWithX:646 Y:507], @"inputBottomRight", [CIVector vectorWithX:548 Y:140], @"inputBottomLeft", [CIVector vectorWithX:155 Y:153], nil];
CIImage *outputImage = [filter outputImage];
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *transformedImage = [UIImage imageWithCGImage:cgimg];
[self setImage:transformedImage];
CGImageRelease(cgimg);

Autres points à noter qui pourraient être importants :

  • Mon UIImageView (75pts x 115 pts) est déjà initialisé via awakeFromNib et est déjà associé à une image (151px x 235px).

  • Le code ci-dessus est implémenté dans le fichier UIImageView - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event fonction.J'espère que je pourrai ajuster la perspective de l'image en fonction des coordonnées de l'écran afin qu'elle donne l'impression que l'image se déplace dans l'espace 3D.

  • Ce code concerne une application iPhone.

Encore une fois, la question que je pense poser est de savoir ce que font les différents vecteurs de paramètres, mais je pose peut-être la mauvaise question.

Le message suivant est très similaire mais demande pourquoi son image disparaît plutôt que comment utiliser CIVectors pour CIPerspectiveTransform.Il a également reçu très peu de succès, peut-être parce qu’il est trop général :Comment puis-je utiliser le filtre CIPerspectiveTransform

Était-ce utile?

La solution

Comme je l'ai commenté sur la question liée, CIPerspectiveTransform est non disponible dans l'implémentation iOS de Core Image à partir d'iOS 5.1.C'est pourquoi vous et l'autre demandeur n'avez vu aucune image, car votre CIFilter était probablement nul.

Si vous souhaitez simplement implémenter une forme de perspective sur une image, il existe deux manières rapides de le faire sur iOS, comme je le décris dans cette réponse.La première consiste simplement à utiliser le bon type de CATransform3D sur le calque d'un UIImageView, mais cela n'est utile que pour l'affichage, pas pour le réglage de l'image.

La deuxième façon consiste à manipuler l'image à l'aide d'une matrice de transformation 3D appropriée dans OpenGL ES.Comme je l'indique dans la réponse ci-dessus, j'ai un framework open source cela résume tout cela, et l'exemple FilterShowcase contient un exemple d'application d'une perspective à la vidéo entrante.Vous pouvez facilement échanger l'entrée vidéo avec votre image et en récupérer une image une fois l'effet de perspective appliqué.

Autres conseils

Ooooold post mais je parie que quelqu'un cherchera encore ce genre de filtre :

La fonction suivante applique le filtre à une image et renvoie la même image avec perspective en essayant de créer un effet de réflexion avec perspective.(L'image suivante n'est qu'un exemple et non le résultat de tests réels)

Example of mirror effect

Ceci est un exemple, vous avez donc besoin de quelques ajustements.Le but est de créer une image qui semble être le reflet de l'image « principale ».

J'ai donc ajouté deux vues d'image à ma vue comme dans l'image.Contraintes ajoutées, etc.

Ensuite, dans la fonction, vous verrez que les coordonnées sont codées en dur afin que l'image renvoyée corresponde parfaitement à son conteneur, le UIImageView inférieur.

enter image description here

func applyperspectiveTransform(imagen: UIImage) -> UIImage
{

      var context = CIContext()
    var outputImage = CIImage()
    var newUIImage = UIImage()

    let leftTop     = CGPoint(x: self.ImgView.frame.origin.x, y: self.ImgReflection.frame.origin.y + self.ImgReflection.frame.size.height)
    let leftBottom  = CGPoint(x: self.ImgReflection.frame.origin.x, y: self.ImgView.frame.origin.y + self.ImgView.frame.size.height)
    let rightTop    = CGPoint(x: self.ImgView.frame.origin.x + self.ImgView.frame.size.width, y: self.ImgReflection.frame.origin.y + self.ImgReflection.frame.size.height)
    let rightBottom = CGPoint(x: self.ImgReflection.frame.origin.x + self.ImgReflection.frame.size.width, y: self.ImgView.frame.origin.y + self.ImgView.frame.size.height)

    let lT = CIVector(x: leftTop.x, y: leftTop.y)
    let lB = CIVector(x: leftBottom.x, y: leftBottom.y)
    let rT = CIVector(x: rightTop.x, y: rightTop.y)
    let rB = CIVector(x: rightBottom.x, y: rightBottom.y)

    let aCIImage = CIImage(image: imagen)
    context = CIContext(options: nil);

    let perspectiveTransform = CIFilter(name: "CIPerspectiveTransform")!

    perspectiveTransform.setValue(lB,forKey: "inputTopLeft")
    perspectiveTransform.setValue(rB,forKey: "inputTopRight")
    perspectiveTransform.setValue(rT,forKey: "inputBottomRight")
    perspectiveTransform.setValue(lT,forKey: "inputBottomLeft")
    perspectiveTransform.setValue(aCIImage,forKey: kCIInputImageKey)

    outputImage = perspectiveTransform.outputImage!
    let cgimg = context.createCGImage(outputImage, from: outputImage.extent)
    newUIImage = UIImage(cgImage: cgimg!)

    return newUIImage
}

Pour cet effet particulier (miroir), vous souhaiterez peut-être ajouter des effets supplémentaires, comme un dégradé, modifier l'alpha, etc.

Bon codage !J'espère que cela aide

J'espère que cela aide!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top