web-dev-qa-db-fra.com

Comment faire pivoter une image de 90 degrés sur iOS?

Ce que je veux faire, c'est prendre une photo de ma caméra, l'envoyer à un serveur, puis le serveur m'envoie l'image sur un viewController. Si l'image est en mode portrait, l'image apparaît bien à l'écran. Toutefois, si l'image a été prise en mode paysage, l'image apparaît tronquée sur l'écran (car elle tente de s'afficher en mode portrait!). Je ne sais pas comment résoudre ce problème, mais je suppose qu'une solution consiste tout d'abord à vérifier si l'image est en mode portrait/paysage, puis si elle est en mode paysage, faites-la pivoter de 90 degrés avant de l'afficher à l'écran. faire ça?

38
user1511244
self.imageview.transform = CGAffineTransformMakeRotation(M_PI_2);

Swift 4:

self.imageview.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi/2))
105
mandeep-dhiman

C’est le code complet pour la rotation de l’image à n’importe quel degré, il suffit de l’ajouter au fichier approprié, c’est-à-dire au format.

forme

@interface UIImage (RotationMethods)
- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees;
@end

@implementation UIImage (RotationMethods)

static CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;};

- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees 
{   
    // calculate the size of the rotated view's containing box for our drawing space
    UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.size.width, self.size.height)];
    CGAffineTransform t = CGAffineTransformMakeRotation(DegreesToRadians(degrees));
    rotatedViewBox.transform = t;
    CGSize rotatedSize = rotatedViewBox.frame.size;

    // Create the bitmap context
    UIGraphicsBeginImageContext(rotatedSize);
    CGContextRef bitmap = UIGraphicsGetCurrentContext();

    // Move the Origin to the middle of the image so we will rotate and scale around the center.
    CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2);

    //   // Rotate the image context
    CGContextRotateCTM(bitmap, DegreesToRadians(degrees));

    // Now, draw the rotated/scaled image into the context
    CGContextScaleCTM(bitmap, 1.0, -1.0);
    CGContextDrawImage(bitmap, CGRectMake(-self.size.width / 2, -self.size.height / 2, self.size.width, self.size.height), [self CGImage]);

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;

}

@end

Il s'agit de l'extrait de code sous forme de l'exemple SquareCam .

Pour appeler la méthode ci-dessus, utilisez simplement le code ci-dessous

UIImage *rotatedSquareImage = [square imageRotatedByDegrees:rotationDegrees];

Ici, square est une UIImage et rotationDegrees est une flote ivar pour faire pivoter l'image en degrés

28
The iOSDev

Swift 3 et Swift 4 utilisent plutôt .pi

par exemple:

//rotate 90 degrees
myImageView.transform = CGAffineTransform(rotationAngle: .pi / 2)

//rotate 180 degrees
myImageView.transform = CGAffineTransform(rotationAngle: .pi)

//rotate 270 degrees
myImageView.transform = CGAffineTransform(rotationAngle: .pi * 1.5)
13
- (UIImage *)rotateImage:(UIImage*)image byDegree:(CGFloat)degrees 
{   
    UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,image.size.width, image.size.height)];
    CGAffineTransform t = CGAffineTransformMakeRotation(DegreesToRadians(degrees));
    rotatedViewBox.transform = t;
    CGSize rotatedSize = rotatedViewBox.frame.size;
    [rotatedViewBox release];

    UIGraphicsBeginImageContext(rotatedSize);
    CGContextRef bitmap = UIGraphicsGetCurrentContext();


    CGContextTranslateCTM(bitmap, rotatedSize.width, rotatedSize.height);

    CGContextRotateCTM(bitmap, DegreesToRadians(degrees));


    CGContextScaleCTM(bitmap, 1.0, -1.0);
    CGContextDrawImage(bitmap, CGRectMake(-image.size.width, -image.size.height, image.size.width, image.size.height), [image CGImage]);

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;

}
11
janusfidel

Ajoutez simplement ce code à l'image.

Image.transform=CGAffineTransformMakeRotation(M_PI / 2);
8
IronManGill

J'ai eu une erreur en essayant cela dans XCode 6.3 Swift 1.2

self.imageview.transform = CGAffineTransformMakeRotation(M_PI_2);

Vous devriez essayer ceci pour forcer le correctif de conversion de type:

self.imageview.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2));
6
mattyU

Swift 3 version:

imageView.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI_2))
3
Dhruv Khatri

Swift 4 | Syntaxe Xcode 9 (veuillez noter que ce code fait pivoter un UIImageView de 90 degrés dans le sens des aiguilles d'une montre, pas un UIImage):

myImageView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi / 2))
2
xscoder

Swift 4+.

arrowImageView.transform = CGAffineTransform(rotationAngle: .pi/2)

Remarque: l'angle est en radian

.pi = 180 degrés 

.pi/2 = 90 degrés

Si vous voulez ajouter avec animation 

  @IBAction func applyTransForm(sender: UIButton) {
        sender.isSelected = !sender.isSelected
        UIView.animate(withDuration: 1, animations: {
        if sender.isSelected {
            self.arrowImageView.transform = CGAffineTransform(rotationAngle: .pi)
        } else {
            self.arrowImageView.transform = CGAffineTransform(rotationAngle: 0)

        }
        })
    }

Sortie:

 enter image description here

2
Jack

Voici la version Swift 2.2 de La réponse iOSDev (en extension UIImage):

func degreesToRadians(degrees: CGFloat) -> CGFloat {
    return degrees * CGFloat(M_PI) / 180
}

func imageRotatedByDegrees(degrees: CGFloat) -> UIImage {
    // calculate the size of the rotated view's containing box for our drawing space
    let rotatedViewBox = UIView(frame: CGRectMake(0,0,self.size.width, self.size.height))
    let t = CGAffineTransformMakeRotation(self.degreesToRadians(degrees))
    rotatedViewBox.transform = t
    let rotatedSize = rotatedViewBox.frame.size

    // Create the bitmap context
    UIGraphicsBeginImageContext(rotatedSize)
    let bitmap = UIGraphicsGetCurrentContext()

    // Move the Origin to the middle of the image so we will rotate and scale around the center.
    CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2);

    // Now, draw the rotated/scaled image into the context
    CGContextScaleCTM(bitmap, 1.0, -1.0);
    CGContextDrawImage(bitmap, CGRectMake(-self.size.width / 2, -self.size.height / 2, self.size.width, self.size.height), self.CGImage);

    let newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;

}
0
Beninho85

Il vaut mieux utiliser uniquement le bitmap. Dans mon cas, utilisez un UIImage qui est dans reference.image et j'ai converti l'image sur base64String. Sans CGAffineTransformMakeRotation et sans rotatedViewBox.transform

var rotatedSize = reference.image.size;
                //Create bitmap context
                UIGraphicsBeginImageContext(rotatedSize);
                var bitmap = UIGraphicsGetCurrentContext();
                //move Origin to the middle of the image for rotation
                CGContextTranslateCTM(bitmap, rotatedSize.width / 2, rotatedSize.height / 2);
                //rotate image context
                CGContextRotateCTM(bitmap, 1.5708);
                CGContextDrawImage(bitmap, CGRectMake(-reference.image.size.width / 2, -reference.image.size.height / 2, reference.image.size.width, reference.image.size.height), reference.image.CGImage);
                var rotatedImage = UIGraphicsGetImageFromCurrentImageContext();
                var base64Image = UIImageJPEGRepresentation(rotatedImage, compression).base64EncodedStringWithOptions(0);
                UIGraphicsEndImageContext();
                return base64Image;
0
Luis Ortiz