Hoe een afbeelding 90 graden draaien op iOS?

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 UIImageen rotationDegreesis één floteivar 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
}

Other episodes