iphone - voltea - Cómo rotar una imagen 90 grados en iOS?
voltear imagen espejo iphone (10)
Aquí está la versión de Swift 2.2 de la respuesta iOSDev (en la extensión 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;
}
Lo que quiero hacer es tomar una instantánea de mi cámara, enviarla a un servidor y luego el servidor me devuelve la imagen en un viewController. Si la imagen está en modo vertical, la imagen aparece bien en la pantalla; sin embargo, si la imagen se tomó en modo horizontal, la imagen aparece estirada en la pantalla (¡mientras intenta aparecer en modo retrato!). No sé cómo solucionar esto, pero supongo que una solución es primero verificar si la imagen está en modo vertical / horizontal y luego, si está en modo horizontal, rotarla 90 grados antes de mostrarla en la pantalla. Entonces, ¿cómo podría hacer eso?
Este es el código completo para la rotación de la imagen en cualquier grado, solo agréguela al archivo apropiado, es decir, en .m, como se muestra a continuación, donde desea utilizar el procesamiento de imágenes.
para .m
@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
Este es el fragmento de código del ejemplo de apple SquareCam .
Para llamar al método anterior simplemente use el código a continuación
UIImage *rotatedSquareImage = [square imageRotatedByDegrees:rotationDegrees];
Aquí el cuadrado es un UIImage
y rotationDegrees es un flote
ivar para girar la imagen que los grados
Simplemente agrega este código a la imagen.
Image.transform=CGAffineTransformMakeRotation(M_PI / 2);
Swift 3 versión:
imageView.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI_2))
Swift 3 y Swift 4 usan .pi en su lugar
p.ej:
//rotate 270 degrees
myImageView.transform = CGAffineTransform(rotationAngle: (.pi * 1.5))
//rotate 90 degrees
myImageView.transform = CGAffineTransform(rotationAngle: (.pi / 2))
Tengo un error al intentar esto en XCode 6.3 Swift 1.2
self.imageview.transform = CGAffineTransformMakeRotation(M_PI_2);
Deberías probar esto para forzar la corrección tipocast:
self.imageview.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2));
Swift 4 | Sintaxis de Xcode 9 (tenga en cuenta que este código gira un UIImageView 90 grados en sentido horario, no un UIImage):
myImageView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi / 2))
Swift 4+.
arrowImageView.transform = CGAffineTransform(rotationAngle: .pi/2)
Nota: el ángulo está en radianes
.pi = 180 grados
.pi / 2 = 90 grados
Si quieres agregar con animación
@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)
}
})
}
Salida:
- (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;
}
self.imageview.transform = CGAffineTransformMakeRotation(M_PI_2);