Comment retourner UIImagehorizontalement, j'ai trouvé la UIImageOrientationUpMirroredvaleur d'énumération dans la UIImageréférence de classe, comment utiliser cette propriété pour retourner UIImage.
Comment retourner UIImagehorizontalement, j'ai trouvé la UIImageOrientationUpMirroredvaleur d'énumération dans la UIImageréférence de classe, comment utiliser cette propriété pour retourner UIImage.
Réponses:
Objectif c
UIImage* sourceImage = [UIImage imageNamed:@"whatever.png"];
UIImage* flippedImage = [UIImage imageWithCGImage:sourceImage.CGImage 
                                            scale:sourceImage.scale
                                      orientation:UIImageOrientationUpMirrored];
Rapide
let flippedImage = myImage.withHorizontallyFlippedOrientation()
              UIImageOrientationUpfonctionné UIImageOrientationUpMirroredsans la retourner. Cela a fonctionné -image = [UIImage imageWithCGImage:image.CGImage scale:image.scale orientation:UIImageOrientationUp]
                    sourceImage.scalepour l'échelle.
                    [flippedImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]. Une idée pourquoi?
                    Un moyen très simple d'y parvenir est de créer une UIImageView au lieu d'une UIImage et d'effectuer la transformation sur UIImageView.
yourImageView.image =[UIImage imageNamed:@"whatever.png"];
yourImageView.transform = CGAffineTransform(scaleX: -1, y: 1); //Flipped
J'espère que cela t'aides.
UIImagemanipulation, qui, selon moi, avait des effets secondaires lorsqu'elle était combinée avec le UIImageRenderingModeAlwaysTemplatemode de rendu.
                    yourImageView.transform = CGAffineTransformIdentity
                    Un retournement vertical est souvent nécessaire pour initialiser la texture OpenGL à l'aide de glTexImage2d(...). Les astuces proposées ci-dessus ne modifient pas réellement les données d'image et ne fonctionneront pas dans ce cas. Voici un code pour faire le flip de données réel inspiré par 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;
}
              J'ai essayé avec imageFlippedForRightToLeftLayoutDirection, et j'ai créé une nouvelle UIImage avec différentes orientations, mais au moins c'est la seule solution que j'ai trouvée pour retourner mon image
let ciimage: CIImage = CIImage(CGImage: imagenInicial.CGImage!)
let rotada3 = ciimage.imageByApplyingTransform(CGAffineTransformMakeScale(-1, 1))
Comme vous pouvez le voir dans mon terrain de jeu, cela a fonctionné !! :)

Et, bien sûr, laissez finalImage = UIImage (CIImage: rotada3)
Tel que défini par l'orientation de l'image:
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
};
J'ai apporté quelques améliorations pour plus de circonstances comme la gestion de UIImage à partir d'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];
              voici la version rapide: (j'ai vu cette question dans les commentaires)
let srcImage = UIImage(named: "imageName")
let flippedImage = UIImage(CGImage: srcImage.CGImage, scale: srcImage.scale, orientation: UIImageOrientation.UpMirrored)
              iOS 10+
[myImage imageWithHorizontallyFlippedOrientation];
Swift 4:
let flippedImage = myImage.withHorizontallyFlippedOrientation()
              Il s'agit d'une implémentation solide pour refléter / retourner une UIImage horizontalement et peut s'appliquer à l'image dans les deux sens. Puisqu'il change les données d'image sous-jacentes, le dessin (comme, capture d'écran) changera également. Testé pour fonctionner, aucune perte de qualité.
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?
}
              Peut-être que cela sera utile pour certains:
    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];
              Pour Swift 3/4:
imageView.transform = CGAffineTransform(scaleX: -1, y: 1)
              Une simple extension.
extension UIImage {
    var flipped: UIImage {
        guard let cgImage = cgImage else {
            return self
        }
        return UIImage(cgImage: cgImage, scale: scale, orientation: .upMirrored)
    }
}
Usage:
let image = #imageLiteral(resourceName: "imageName")
let imageView = UIImageView(image: image.flipped)
              Ceci est une version compatible iOS8 / 9:
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;
              imageFlippedForRightToLeftLayoutDirection est destiné à être utilisé avec des directions de mise en page inversées - par exemple pour les pays arabes. Donc, utiliser cela peut ne pas toujours fonctionner comme vous le souhaitez.
                    Testé dans Swift 3 et supérieur
Voici la solution simple pour résoudre ce problème avec les extensions. Je l'ai testé et cela a fonctionné. Vous pouvez refléter dans n'importe quelle direction.
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)
    }
}
Utilisation de ce code
let image = #imageLiteral(resourceName: "imageName")
flipHorizontally = image.imageUpMirror()
Ainsi de suite, vous pouvez utiliser d'autres fonctions.
Voici l'une des réponses ci-dessus modifiées et dans Swift 3 que j'ai trouvée particulièrement utile lorsque vous avez un bouton qui doit continuer à faire pivoter l'image d'avant en arrière.
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)
    }
Utilisation:
imageToFlip: UIImage = flipImage(sourceImage: imageToFlip, orientation: imageToFlip.imageOrientation)
              Swift 4
yourImage.transform = CGAffineTransform(scaleX: -1, y: 1)
              En raison du déballage, procédez comme suit:
let srcImage = UIImage(named: "myimage")!
let flippedImage = UIImage(cgImage: srcImage.cgImage!, 
                   scale: srcImage.scale, orientation: UIImage.Orientation.upMirrored)
              vous pouvez faire pivoter l'image comme vous le souhaitez en utilisant ceci
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
}
}
Swift 5 - Xcode 11.5
La meilleure solution pour une rotation horizontale: regardez cette vidéo:
https://m.youtube.com/watch?v=4kSLbuB-MlU
Ou utilisez ce code:
    
import UIKit
class FirstViewControl: UIViewController {
    @IBOutlet weak var buttonAnim: UIButton!
    @IBAction func ClickOnButtonAnim(_ sender: UIButton) {    
        UIView.transition(with: buttonAnim, duration: 0.4, options: .transitionFlipFromLeft, animation: nil , completion: nil)
    }
}
Vous pouvez utiliser n'importe quelle interface utilisateur (bouton ou étiquette ou uiview ou image) dans cette animation.