Pregunta

Me está costando mucho encontrar documentación en línea que explique claramente cómo implementar correctamente el filtro CIPerspectiveTransform de Core Image.En particular, al establecer valores de CIVector para inputTopLeft, inputTopRight, inputBottomRight, y inputBottomLeft, ¿qué le hacen estos vectores a la imagen?(Es decir, ¿cuál es la matemática detrás de cómo estos vectores deforman mi imagen?)

Actualmente este es el código que estoy usando.No falla, pero no muestra una imagen:

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);

Otras cosas a tener en cuenta que podrían ser importantes:

  • Mi UIImageView (75pts x 115 pts) ya está inicializado a través de awakeFromNib y ya tiene una imagen (151px x 235px) asociada.

  • El código anterior se está implementando en UIImageView. - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event función.La esperanza es poder ajustar la perspectiva de la imagen según las coordenadas de la pantalla para que parezca que la imagen se mueve en un espacio 3D.

  • Este código es para una aplicación de iPhone.

Nuevamente, la pregunta que creo que estoy haciendo es qué hacen los distintos vectores de parámetros, pero es posible que esté haciendo la pregunta equivocada.

La siguiente publicación es muy similar pero pregunta por qué su imagen desaparece en lugar de cómo usar CIVectors para CIPerspectiveTransform.También ha recibido muy poca tracción, tal vez porque es demasiado general:¿Cómo puedo utilizar el filtro CIPerspectiveTransform?

¿Fue útil?

Solución

Como comenté en la pregunta vinculada, CIPerspectiveTransform es no disponible en la implementación iOS de Core Image a partir de iOS 5.1.Es por eso que usted y el otro autor de la pregunta no vieron ninguna imagen como resultado, porque lo más probable es que su CIFilter fuera nulo.

Si solo desea implementar una forma de perspectiva en una imagen, hay dos formas rápidas diferentes de hacerlo en iOS, como lo describo en esta respuesta.Una es simplemente usar el tipo correcto de CATransform3D en la capa de UIImageView, pero esto solo es útil para visualización, no para ajuste de imagen.

La segunda forma es manipular la imagen utilizando una matriz de transformación 3D adecuada en OpenGL ES.Como indico en la respuesta vinculada anteriormente, tengo un marco de código abierto eso envuelve todo esto, y el ejemplo de FilterShowcase tiene un ejemplo de cómo aplicar una perspectiva al video entrante.Puede intercambiar fácilmente la entrada de video con su imagen y tomar una imagen después de aplicar el efecto de perspectiva.

Otros consejos

Publicación muy antigua, pero apuesto a que alguien todavía buscará este tipo de filtro:

La siguiente función aplica el filtro a una imagen y devuelve la misma imagen con perspectiva intentando crear un efecto de reflejo con perspectiva.(La siguiente imagen es sólo un ejemplo y no el resultado de pruebas reales)

Example of mirror effect

Este es un ejemplo, por lo que necesita algunos ajustes.El objetivo es crear una imagen que parezca un reflejo de la "principal".

Entonces agregué dos vistas de imágenes a mi vista como en la imagen.Restricciones agregadas, etc.

Luego, en la función, verá que las coordenadas están codificadas de modo que la imagen devuelta coincida perfectamente con su contenedor, el UIImageView inferior.

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
}

Para este efecto en particular (espejo), es posible que desees agregar algunos efectos más, como un degradado, cambiar el alfa, etc.

¡Feliz codificación!Espero eso ayude

¡Espero eso ayude!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top