Cómo voltear la UIImage horizontalmente, he encontrado UIImageOrientationUpMirrored valor de enumeración en el UIImage de referencia de la clase, cómo hacer uso de esta propiedad para voltear UIImage.

  • Para agregar a aroth bien la respuesta, Apple explica los otros tipos de imagen orientaciones muy bien en este enlace
  • Como el aceptado no estaba funcionando para mí, he encontrado esta categoría. Funciona como un encanto.
InformationsquelleAutor pradeepa | 2011-03-23

18 Comentarios

  1. 228
    UIImage* sourceImage = [UIImage imageNamed:@"whatever.png"];
    
    UIImage* flippedImage = [UIImage imageWithCGImage:sourceImage.CGImage 
                                                scale:sourceImage.scale
                                          orientation:UIImageOrientationUpMirrored];
    • Hay dos problemas con esta respuesta escala no es de 1.0 en la retina competible imágenes y por alguna razón UIImageOrientationUp trabajado, mientras que UIImageOrientationUpMirrored no mover de un tirón. Esto funcionó – image = [UIImage imageWithCGImage:image.CGImage scale:image.scale orientation:UIImageOrientationUp]
    • como me di cuenta, la orientación parámetro que se le pasa es utilizado para determinar ‘lo que el sourceImage la orientación es ya’ en oposición a ‘me da esta imagen con esta orientación específica’. Por lo tanto, usted puede inspeccionar sourceImage.imageOrientation parámetro y pasar de una orientación distinta a la de engañar al método para darte lo que quieres
    • Sería mejor utilizar sourceImage.scale para la escala.
    • Cómo hacer esto en Swift? [UIImage imageWithCGImage…] no está disponible allí.
    • CGImage!, escala: CGFloat, orientación: UIImageOrientation)
    • Esto parece romper por completo cuando intento hacer [flippedImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]. Alguna idea de por qué?
    • Que es incorrecta. El uso de UIImageOrientationDownMirrored, mueve de un tirón el pasado de la imagen sobre el eje horizontal.

  2. 65

    Una manera muy simple que se puede lograr esto es mediante la creación de un UIImageView en lugar de un UIImage y hacer la transformación en UIImageView.

    yourImageView.image =[UIImage imageNamed:@"whatever.png"];
    yourImageView.transform = CGAffineTransform(scaleX: -1, y: 1); //Flipped

    Espero que esto ayude.

    • Esto terminó trabajando mucho mejor para mí que el UIImage manipulación, que he encontrado tenido efectos secundarios cuando se combina con UIImageRenderingModeAlwaysTemplate el modo de representación.
    • Gracias por compartir esto. No he tenido suerte con la «respuesta» a este rompecabezas asociados con este post, pero tu respuesta trabajado fenomenalmente bien y era de sólo el 1 línea de código.
    • Funciona muy bien! iOS 9+ ahora también incluye flipsForRightToLeftLayoutDirection, pero no funciona para iOS 8+ apps todavía.
    • Si desea restablecer flipping, a continuación, utilizar yourImageView.transform = CGAffineTransformIdentity
    • Nota: este método se «transforman» en UIImageView. No voltear la real UIImage.
    • Si usted necesita para transformar el contenido, transformar el contenedor no es una solución fiable. Si necesito guardar o enviar la imagen no podía voltear todos UIImageViews, tengo que voltear la UImage…

  3. 35

    Vertical flip es a menudo necesaria para iniciar la textura de OpenGL utilizando glTexImage2d(...). La propuesta de trucos en realidad no modificar los datos de la imagen y no funciona en este caso. Aquí es un código para hacer que los datos reales flip inspirado por https://stackoverflow.com/a/17909372

    - (UIImage *)flipImage:(UIImage *)image
    {
        UIGraphicsBeginImageContext(image.size);
        CGContextDrawImage(UIGraphicsGetCurrentContext(),CGRectMake(0.,0., image.size.width, image.size.height),image.CGImage);
        UIImage *i = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return i;
    }
    • ¿Cómo afecta este cambio de imagen? Sólo se ve como se dibuja la imagen de nuevo.
    • Creo que dé la vuelta debido a los diferentes sistemas de coordenadas (es decir, el eje Y dirección), mientras que el dibujo.
    • Hay una manera de usar esto para voltear la imagen verticalmente?
    • Esto funciona, pero la calidad de imagen se reduce.
    • este método bien admite también la representación de la imagen – siempre plantilla
    • Para solucionar el tema de la calidad, el uso de UIGraphicsBeginImageContextWithOptions(la imagen.su tamaño, NO, la imagen.la escala); en su lugar.

  4. 12

    Como Orientación de Imagen Define:

    typedef NS_ENUM(NSInteger, UIImageOrientation) {
    UIImageOrientationUp,            //default orientation
    UIImageOrientationDown,          //180 deg rotation
    UIImageOrientationLeft,          //90 deg CCW
    UIImageOrientationRight,         //90 deg CW
    UIImageOrientationUpMirrored,    //as above but image mirrored along other axis. horizontal flip
    UIImageOrientationDownMirrored,  //horizontal flip
    UIImageOrientationLeftMirrored,  //vertical flip
    UIImageOrientationRightMirrored, //vertical flip
    };

    He hecho algunas mejoras más circunstancias como el manejo de los UIImage de AVCaptureSession.

    UIImage* sourceImage = [UIImage imageNamed:@"whatever.png"];
    UIImageOrientation flipingOrientation;
    if(sourceImage.imageOrientation>=4){
        flippedOrientation = sourceImage.imageOrientation - 4;
    }else{
        flippedOrientation = sourceImage.imageOrientation + 4;
    }
    UIImage* flippedImage = [UIImage imageWithCGImage:sourceImage.CGImage 
                         scale: sourceImage.scale orientation: flipingOrientation];
  5. 12

    He probado con imageFlippedForRightToLeftLayoutdirection, y la creación de un nuevo UIImage con diferentes orientaciones, pero al menos esta es la única solución que he encontrado para voltear mi imagen

    let ciimage: CIImage = CIImage(CGImage: imagenInicial.CGImage!)
    let rotada3 = ciimage.imageByApplyingTransform(CGAffineTransformMakeScale(-1, 1))

    Como se puede ver en mi patio de recreo funcionó!! 🙂
    Cómo voltear UIImage horizontal?

    Y, por supuesto, vamos a finalImage = UIImage(CIImage: rotada3)

    • FINALMENTE. por dios…
    • Lo siento, pero parece que ya no funciona, al menos con la cámara toma imágenes…
  6. 9

    aquí swift versión: (vi esta pregunta en los comentarios)

    let srcImage = UIImage(named: "imageName")
    let flippedImage = UIImage(CGImage: srcImage.CGImage, scale: srcImage.scale, orientation: UIImageOrientation.UpMirrored)
  7. 6

    Esta es una implementación sólida de espejo/voltear un UIImage horizontalmente, y se puede aplicar a la imagen de ida y vuelta. Ya que los cambios en el subyacente de los datos de la imagen, el dibujo(por ejemplo, captura de pantalla) también va a cambiar. Probado para trabajar, sin pérdida de calidad.

    func flipImage() -> UIImage? {
            UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
            let bitmap = UIGraphicsGetCurrentContext()!
    
            bitmap.translateBy(x: size.width / 2, y: size.height / 2)
            bitmap.scaleBy(x: -1.0, y: -1.0)
    
            bitmap.translateBy(x: -size.width / 2, y: -size.height / 2)
            bitmap.draw(self.cgImage!, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
    
            let image = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
    
            return image?
    }
    • Esto funciona! gracias!
  8. 5

    Puede ser que esto sea de utilidad para algunos:

        UIImageOrientation imageOrientation;
    
        switch (sourceImage.imageOrientation) {
            case UIImageOrientationDown:
                imageOrientation = UIImageOrientationDownMirrored;
                break;
    
            case UIImageOrientationDownMirrored:
                imageOrientation = UIImageOrientationDown;
                break;
    
            case UIImageOrientationLeft:
                imageOrientation = UIImageOrientationLeftMirrored;
                break;
    
            case UIImageOrientationLeftMirrored:
                imageOrientation = UIImageOrientationLeft;
    
                break;
    
            case UIImageOrientationRight:
                imageOrientation = UIImageOrientationRightMirrored;
    
                break;
    
            case UIImageOrientationRightMirrored:
                imageOrientation = UIImageOrientationRight;
    
                break;
    
            case UIImageOrientationUp:
                imageOrientation = UIImageOrientationUpMirrored;
                break;
    
            case UIImageOrientationUpMirrored:
                imageOrientation = UIImageOrientationUp;
                break;
            default:
                break;
        }
    
        resultImage = [UIImage imageWithCGImage:sourceImage.CGImage scale:sourceImage.scale orientation:imageOrientation];
  9. 5

    Para Swift 3/4:

    imageView.transform = CGAffineTransform(scaleX: -1, y: 1)
    • Esto es para un UIImageView, el OP está buscando un UIImage
  10. 2

    Una simple extensión.

    extension UIImage {
    
        var flipped: UIImage {
            guard let cgImage = cgImage else {
                return self
            }
    
            return UIImage(cgImage: cgImage, scale: scale, orientation: .upMirrored)
        }
    }

    Uso:

    let image = #imageLiteral(resourceName: "imageName")
    let imageView = UIImageView(image: image.flipped)
    • Las extensiones son una de las mejores características de Swift. Estoy sorprendido de que la respuesta anterior no pudo recomendar. Me gusta esta versión mucho mejor.
  11. 1

    Este es un trabajo iOS8/9 versión compatible:

    UIImage *image = [UIImage imageNamed:name];
    
    if ([[UIApplication sharedApplication] userInterfaceLayoutDirection] == UIUserInterfaceLayoutDirectionRightToLeft) {
    
        if ([image respondsToSelector:@selector(imageFlippedForRightToLeftLayoutDirection)]) {
            //iOS9
            image = image.imageFlippedForRightToLeftLayoutDirection;
        }
        else {
            //iOS8
            CIImage *coreImage = [CIImage imageWithCGImage:image.CGImage];
            coreImage = [coreImage imageByApplyingTransform:CGAffineTransformMakeScale(-1, 1)];
            image = [UIImage imageWithCIImage:coreImage scale:image.scale orientation:UIImageOrientationUp];
        }
    }
    
    return image;
    • Yo no creo que esta sea la mejor idea. Este imageFlippedForRightToLeftLayoutDirection está destinado a ser utilizado con volteado diseño de direcciones – por ejemplo, para los países árabes. Así que el uso de este puede que no siempre funciona como se desea.
    • Sí, usted está en lo correcto – en mi caso fue exactamente para RTL apoyo. Todos sabemos código en LO es para la referencia y la gente realmente no le basta con copiar/pegar sin entender primero, ¿verdad?
  12. 1

    Probado en Swift 3 y por encima de

    Aquí es la solución simple para lograr este problema con las extensiones.
    Puedo probar y funcionó. Usted puede espejo en cualquier dirección.

    extension UIImage {
    
        func imageUpMirror() -> UIImage {
            guard let cgImage = cgImage else { return self }
            return UIImage(cgImage: cgImage, scale: scale, orientation: .upMirrored)
        }
    
        func imageDownMirror() -> UIImage {
            guard let cgImage = cgImage else { return self }
            return UIImage(cgImage: cgImage, scale: scale, orientation: .downMirrored)
        }
    
        func imageLeftMirror() -> UIImage {
            guard let cgImage = cgImage else { return self }
            return UIImage(cgImage: cgImage, scale: scale, orientation: .leftMirrored)
        }
    
        func imageRightMirror() -> UIImage {
            guard let cgImage = cgImage else { return self }
            return UIImage(cgImage: cgImage, scale: scale, orientation: .rightMirrored)
        }
    }

    Uso de este código

    let image = #imageLiteral(resourceName: "imageName")
    flipHorizontally = image.imageUpMirror()

    Así sucesivamente, puede utilizar otras funciones.

    • guardar mi mucho tiempo gracias
  13. 0

    He aquí una de las respuestas anteriores modificado y en Swift 3 que he encontrado particularmente útil cuando usted tiene un botón que necesita para mantener a darle la vuelta a la imagen de ida y vuelta.

    func flipImage(sourceImage: UIImage,orientation: UIImageOrientation) -> UIImage {
    
    
            var imageOrientation = orientation
    
            switch sourceImage.imageOrientation {
    
            case UIImageOrientation.down:
                imageOrientation = UIImageOrientation.downMirrored;
                break;
    
            case UIImageOrientation.downMirrored:
                imageOrientation = UIImageOrientation.down;
                break;
    
            case UIImageOrientation.left:
                imageOrientation = UIImageOrientation.leftMirrored;
                break;
    
            case UIImageOrientation.leftMirrored:
                imageOrientation = UIImageOrientation.left;
    
                break;
    
            case UIImageOrientation.right:
                imageOrientation = UIImageOrientation.rightMirrored;
    
                break;
    
            case UIImageOrientation.rightMirrored:
                imageOrientation = UIImageOrientation.right;
    
                break;
    
            case UIImageOrientation.up:
                imageOrientation = UIImageOrientation.upMirrored;
                break;
    
            case UIImageOrientation.upMirrored:
                imageOrientation = UIImageOrientation.up;
                break;
    
    
            }
    
    
            return UIImage(cgImage: sourceImage.cgImage!, scale: sourceImage.scale, orientation: imageOrientation)
    
        }

    Uso:

    imageToFlip: UIImage = flipImage(sourceImage: imageToFlip, orientation: imageToFlip.imageOrientation)
  14. 0

    aroth la respuesta en SWIFT 3:

    let sourceImage = UIImage(named: "whatever.png")!
    let flippedImage = UIImage(cgImage: sourceImage.cgImage!, scale: sourceImage.scale, orientation: .upMirrored)
  15. 0

    Swift 4

    yourImage.transform = CGAffineTransform(scaleX: -1, y: 1)
    • Código sólo respuestas son generalmente considerados de baja calidad. Además de su código, explicar cómo y por qué funciona, el problema se soluciona, o responde a la pregunta.
    • También, esto no funciona para la OPs pregunta, como le está pidiendo a voltear la imagen. El código aquí voltea la vista de la imagen. Ambos son muy diferentes en términos de donde pueden ser utilizados. por ejemplo, un botón que tiene una imagen no es una imagen de la vista.
    • También, usted acaba de copiar mi respuesta y escribió swift 4
  16. 0

    Debido a desenvolver hacer lo siguiente:

    let srcImage = UIImage(named: "myimage")!
    let flippedImage = UIImage(cgImage: srcImage.cgImage!, 
                       scale: srcImage.scale, orientation: UIImage.Orientation.upMirrored)
  17. 0

    puede rotar la imagen como desee utilizando este

    SWIFT 4

    extension UIImage {
    public func imageRotatedByDegrees(degrees: CGFloat, flip: Bool) -> UIImage {
    let radiansToDegrees: (CGFloat) -> CGFloat = {
    return $0 * (180.0 / CGFloat(M_PI))
    }
    let degreesToRadians: (CGFloat) -> CGFloat = {
    return $0 / 180.0 * CGFloat(M_PI)
    }
    //calculate the size of the rotated view's containing box for our drawing space
    let rotatedViewBox = UIView(frame: CGRect(origin: CGPoint.zero, size: size))
    let t = CGAffineTransform(rotationAngle: degreesToRadians(degrees));
    rotatedViewBox.transform = t
    let rotatedSize = rotatedViewBox.frame.size
    //Create the bitmap context
    UIGraphicsBeginImageContext(rotatedSize)
    let bitmap = UIGraphicsGetCurrentContext()!
    bitmap.translateBy(x: rotatedSize.width / 2.0, y: rotatedSize.height / 2.0)
    //Move the origin to the middle of the image so we will rotate and scale around the center.
    //CGContextTranslateCTM(bitmap, rotatedSize.width /2.0, rotatedSize.height /2.0);
    //  //Rotate the image context
    bitmap.rotate(by: degreesToRadians(degrees))
    //CGContextRotateCTM(bitmap, degreesToRadians(degrees));
    //Now, draw the rotated/scaled image into the context
    var yFlip: CGFloat
    if(flip){
    yFlip = CGFloat(-1.0)
    } else {
    yFlip = CGFloat(1.0)
    }
    bitmap.scaleBy(x: yFlip, y: -1.0)
    //CGContextScaleCTM(bitmap, yFlip, -1.0)
    bitmap.draw(self.cgImage!, in: CGRect.init(x: -size.width / 2, y: -size.height / 2, width: size.width, height: size.height))
    //CGContextDrawImage(bitmap, CGRectMake(-size.width /2, -size.height /2, size.width, size.height), CGImage)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    return newImage
    }

    }

Dejar respuesta

Please enter your comment!
Please enter your name here