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?
self.imageview.transform = CGAffineTransformMakeRotation(M_PI_2);
Swift 4:
self.imageview.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi/2))
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
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)
- (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;
}
Ajoutez simplement ce code à l'image.
Image.transform=CGAffineTransformMakeRotation(M_PI / 2);
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));
Swift 3 version:
imageView.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI_2))
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))
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:
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;
}
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;