How to Rotate a UIImage 90 degrees?

前端 未结 19 1229
天涯浪人
天涯浪人 2020-11-22 08:45

I have a UIImage that is UIImageOrientationUp (portrait) that I would like to rotate counter-clockwise by 90 degrees (to landscape). I don\'t want

19条回答
  •  轮回少年
    2020-11-22 08:57

    Check out the simple and awesome code of Hardy Macia at: cutting-scaling-and-rotating-uiimages

    Just call

    UIImage *rotatedImage = [originalImage imageRotatedByDegrees:90.0];
    

    Thanks Hardy Macia!

    Header:

    • (UIImage *)imageAtRect:(CGRect)rect;
    • (UIImage *)imageByScalingProportionallyToMinimumSize:(CGSize)targetSize;
    • (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize;
    • (UIImage *)imageByScalingToSize:(CGSize)targetSize;
    • (UIImage *)imageRotatedByRadians:(CGFloat)radians;
    • (UIImage *)imageRotatedByDegrees:(CGFloat)degrees;

    Since the link may die, here's the complete code

    //
    //  UIImage-Extensions.h
    //
    //  Created by Hardy Macia on 7/1/09.
    //  Copyright 2009 Catamount Software. All rights reserved.
    //
    #import 
    #import 
    
    @interface UIImage (CS_Extensions)
    - (UIImage *)imageAtRect:(CGRect)rect;
    - (UIImage *)imageByScalingProportionallyToMinimumSize:(CGSize)targetSize;
    - (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize;
    - (UIImage *)imageByScalingToSize:(CGSize)targetSize;
    - (UIImage *)imageRotatedByRadians:(CGFloat)radians;
    - (UIImage *)imageRotatedByDegrees:(CGFloat)degrees;
    
    @end;
    
    //
    //  UIImage-Extensions.m
    //
    //  Created by Hardy Macia on 7/1/09.
    //  Copyright 2009 Catamount Software. All rights reserved.
    //
    
    #import "UIImage-Extensions.h"
    
    CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;};
    CGFloat RadiansToDegrees(CGFloat radians) {return radians * 180/M_PI;};
    
    @implementation UIImage (CS_Extensions)
    
    -(UIImage *)imageAtRect:(CGRect)rect
    {
    
       CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], rect);
       UIImage* subImage = [UIImage imageWithCGImage: imageRef];
       CGImageRelease(imageRef);
    
       return subImage;
    
    }
    
    - (UIImage *)imageByScalingProportionallyToMinimumSize:(CGSize)targetSize {
    
       UIImage *sourceImage = self;
       UIImage *newImage = nil;
    
       CGSize imageSize = sourceImage.size;
       CGFloat width = imageSize.width;
       CGFloat height = imageSize.height;
    
       CGFloat targetWidth = targetSize.width;
       CGFloat targetHeight = targetSize.height;
    
       CGFloat scaleFactor = 0.0;
       CGFloat scaledWidth = targetWidth;
       CGFloat scaledHeight = targetHeight;
    
       CGPoint thumbnailPoint = CGPointMake(0.0,0.0);
    
       if (CGSizeEqualToSize(imageSize, targetSize) == NO) {
    
          CGFloat widthFactor = targetWidth / width;
          CGFloat heightFactor = targetHeight / height;
    
          if (widthFactor > heightFactor) 
             scaleFactor = widthFactor;
          else
             scaleFactor = heightFactor;
    
          scaledWidth  = width * scaleFactor;
          scaledHeight = height * scaleFactor;
    
          // center the image
    
          if (widthFactor > heightFactor) {
             thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
          } else if (widthFactor < heightFactor) {
             thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
          }
       }
    
    
       // this is actually the interesting part:
    
       UIGraphicsBeginImageContext(targetSize);
    
       CGRect thumbnailRect = CGRectZero;
       thumbnailRect.origin = thumbnailPoint;
       thumbnailRect.size.width  = scaledWidth;
       thumbnailRect.size.height = scaledHeight;
    
       [sourceImage drawInRect:thumbnailRect];
    
       newImage = UIGraphicsGetImageFromCurrentImageContext();
       UIGraphicsEndImageContext();
    
       if(newImage == nil) NSLog(@"could not scale image");
    
    
       return newImage ;
    }
    
    
    - (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize {
    
       UIImage *sourceImage = self;
       UIImage *newImage = nil;
    
       CGSize imageSize = sourceImage.size;
       CGFloat width = imageSize.width;
       CGFloat height = imageSize.height;
    
       CGFloat targetWidth = targetSize.width;
       CGFloat targetHeight = targetSize.height;
    
       CGFloat scaleFactor = 0.0;
       CGFloat scaledWidth = targetWidth;
       CGFloat scaledHeight = targetHeight;
    
       CGPoint thumbnailPoint = CGPointMake(0.0,0.0);
    
       if (CGSizeEqualToSize(imageSize, targetSize) == NO) {
    
          CGFloat widthFactor = targetWidth / width;
          CGFloat heightFactor = targetHeight / height;
    
          if (widthFactor < heightFactor) 
             scaleFactor = widthFactor;
          else
             scaleFactor = heightFactor;
    
          scaledWidth  = width * scaleFactor;
          scaledHeight = height * scaleFactor;
    
          // center the image
    
          if (widthFactor < heightFactor) {
             thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
          } else if (widthFactor > heightFactor) {
             thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
          }
       }
    
    
       // this is actually the interesting part:
    
       UIGraphicsBeginImageContext(targetSize);
    
       CGRect thumbnailRect = CGRectZero;
       thumbnailRect.origin = thumbnailPoint;
       thumbnailRect.size.width  = scaledWidth;
       thumbnailRect.size.height = scaledHeight;
    
       [sourceImage drawInRect:thumbnailRect];
    
       newImage = UIGraphicsGetImageFromCurrentImageContext();
       UIGraphicsEndImageContext();
    
       if(newImage == nil) NSLog(@"could not scale image");
    
    
       return newImage ;
    }
    
    
    - (UIImage *)imageByScalingToSize:(CGSize)targetSize {
    
       UIImage *sourceImage = self;
       UIImage *newImage = nil;
    
       //   CGSize imageSize = sourceImage.size;
       //   CGFloat width = imageSize.width;
       //   CGFloat height = imageSize.height;
    
       CGFloat targetWidth = targetSize.width;
       CGFloat targetHeight = targetSize.height;
    
       //   CGFloat scaleFactor = 0.0;
       CGFloat scaledWidth = targetWidth;
       CGFloat scaledHeight = targetHeight;
    
       CGPoint thumbnailPoint = CGPointMake(0.0,0.0);
    
       // this is actually the interesting part:
    
       UIGraphicsBeginImageContext(targetSize);
    
       CGRect thumbnailRect = CGRectZero;
       thumbnailRect.origin = thumbnailPoint;
       thumbnailRect.size.width  = scaledWidth;
       thumbnailRect.size.height = scaledHeight;
    
       [sourceImage drawInRect:thumbnailRect];
    
       newImage = UIGraphicsGetImageFromCurrentImageContext();
       UIGraphicsEndImageContext();
    
       if(newImage == nil) NSLog(@"could not scale image");
    
    
       return newImage ;
    }
    
    
    - (UIImage *)imageRotatedByRadians:(CGFloat)radians
    {
       return [self imageRotatedByDegrees:RadiansToDegrees(radians)];
    }
    
    - (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;
       [rotatedViewBox release];
    
       // 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;
    

提交回复
热议问题