Wat ik wil doen is een momentopname van mijn camera maken, deze naar een server sturen en dan stuurt de server mij de afbeelding terug op een viewController. Als de afbeelding in staande modus is, wordt de afbeelding goed weergegeven op het scherm, maar als de afbeelding in liggende modus is gemaakt, verschijnt de afbeelding uitgerekt op het scherm (zoals het probeert te verschijnen in staande modus!). Ik weet niet hoe ik dit moet oplossen, maar ik denk dat een oplossing eerst is om te controleren of de afbeelding zich in de staande/liggende modus bevindt en vervolgens, als deze zich in de liggende modus bevindt, deze 90 graden te draaien voordat deze op het scherm wordt weergegeven.
Dus hoe zou ik dat kunnen doen?
Antwoord 1, autoriteit 100%
self.imageview.transform = CGAffineTransformMakeRotation(M_PI_2);
Swift 4+:
self.imageview.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi/2))
Antwoord 2, autoriteit 23%
Dit is de volledige code voor het roteren van een afbeelding in welke mate dan ook, voeg het gewoon toe aan het juiste bestand, dwz in .m zoals hieronder waar u de beeldverwerking wilt gebruiken
voor .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
Dit is het codefragment van Apple’s SquareCamvoorbeeld.
Gebruik de onderstaande code om de bovenstaande methode aan te roepen
UIImage *rotatedSquareImage = [square imageRotatedByDegrees:rotationDegrees];
Hier is het vierkantéén UIImage
en rotationDegreesis één flote
ivar om de afbeelding die graden te roteren
Antwoord 3, autoriteit 16%
Swift 3 en Swift 4 gebruiken in plaats daarvan .pi
bijvoorbeeld:
//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)
Antwoord 4, autoriteit 11%
- (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;
}
Antwoord 5, autoriteit 6%
Voeg deze code gewoon toe aan de afbeelding.
Image.transform=CGAffineTransformMakeRotation(M_PI / 2);
Antwoord 6, autoriteit 5%
Ik kreeg een foutmelding toen ik dit probeerde in XCode 6.3 Swift 1.2
self.imageview.transform = CGAffineTransformMakeRotation(M_PI_2);
Probeer dit om type cast fix te forceren:
self.imageview.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2));
Swift 4 Bewerken
imageview.transform = CGAffineTransform(rotationAngle: .pi)
Antwoord 7, autoriteit 2%
Swift 3-versie:
imageView.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI_2))
Antwoord 8, autoriteit 2%
Swift 4+.
arrowImageView.transform = CGAffineTransform(rotationAngle: .pi/2)
Opmerking: hoek is in radialen
.pi = 180 graden
.pi/2 = 90 graden
Als je wilt toevoegen met animatie
@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)
}
})
}
Uitvoer:
Antwoord 9, autoriteit 2%
Swift 4 | Xcode 9-syntaxis(houd er rekening mee dat deze code een UIImageView 90 graden met de klok mee roteert, geen UIImage):
myImageView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi / 2))
Antwoord 10, autoriteit 2%
func imageRotatedByDegrees(oldImage: UIImage, deg degrees: CGFloat) -> UIImage {
let size = oldImage.size
UIGraphicsBeginImageContext(size)
let bitmap: CGContext = UIGraphicsGetCurrentContext()!
//Move the origin to the middle of the image so we will rotate and scale around the center.
bitmap.translateBy(x: size.width / 2, y: size.height / 2)
//Rotate the image context
bitmap.rotate(by: (degrees * CGFloat(Double.pi / 180)))
//Now, draw the rotated/scaled image into the context
bitmap.scaleBy(x: 1.0, y: -1.0)
let origin = CGPoint(x: -size.width / 2, y: -size.width / 2)
bitmap.draw(oldImage.cgImage!, in: CGRect(origin: origin, size: size))
let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return newImage
}
Gebruik van functie
imageRotatedByDegrees(oldImage: yourImage, deg: degree)
11
Hier is de Swift 2.2-versie van het IOSDEV-antwoord (in UIImage-extensie):
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;
}
12
Het is het best alleen de bitmap. Gebruik in mijn geval een uiImage die in referentie is. Opgelopen en ik heb het beeld geconverteerd op de Base64Sstring. Zonder CGaffinetransformMakerotation en zonder 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;
13
Als u een afbeelding wilt opslaan, moet u de afbeeldingscontext roteren, niet de weergave. Ik heb hierboven gegeven voorbeelden gebruikt, maar ze werkten niet goed bij het centreren van de afbeelding. Dus ik heb het als volgt verbeterd en gerepareerd:
func imageRotatedByDegrees(deg degrees: CGFloat) -> UIImage {
UIGraphicsBeginImageContext(CGSize(width: self.size.height, height: self.size.width))
let bitmap: CGContext = UIGraphicsGetCurrentContext()!
// Move the origin to the middle of the image so we will rotate and scale around the center.
bitmap.translateBy(x: self.size.width / 2, y: self.size.height / 2)
// Rotate the image context
bitmap.rotate(by: (degrees * CGFloat(Double.pi / 180)))
// Now, draw the rotated/scaled image into the context
bitmap.scaleBy(x: 1.0, y: -1.0)
let origin = CGPoint(x: -self.size.height / 2, y: -self.size.width / 2)
bitmap.draw(self.cgImage!, in: CGRect(origin: origin, size: CGSize(width: self.size.width, height: self.size.height)))
let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return newImage
}