How Can I Rotate A UIImage and Image Data By 90 Degrees

前端 未结 6 685
难免孤独
难免孤独 2021-02-09 16:09

I have a UIImageView that contains an image. At the minute the user can click to save the image within the UIImageView to disk.

I would like to make it so that the the

6条回答
  •  暗喜
    暗喜 (楼主)
    2021-02-09 16:46

    I have such code in my old app. But this code can be simplified because you have no need to rotate it on non-90 degrees angle.

    Objective-C

    @implementation UIImage (Rotation)
    
    - (UIImage *)imageRotatedOnDegrees:(CGFloat)degrees
    {
      // Follow ing code can only rotate images on 90, 180, 270.. degrees.
      CGFloat roundedDegrees = (CGFloat)(round(degrees / 90.0) * 90.0);
      BOOL sameOrientationType = ((NSInteger)roundedDegrees) % 180 == 0;
      CGFloat radians = M_PI * roundedDegrees / 180.0;
      CGSize newSize = sameOrientationType ? self.size : CGSizeMake(self.size.height, self.size.width);
    
      UIGraphicsBeginImageContext(newSize);
      CGContextRef ctx = UIGraphicsGetCurrentContext();
      CGImageRef cgImage = self.CGImage;
      if (ctx == NULL || cgImage == NULL) {
        UIGraphicsEndImageContext();
        return self;
      }
    
      CGContextTranslateCTM(ctx, newSize.width / 2.0, newSize.height / 2.0);
      CGContextRotateCTM(ctx, radians);
      CGContextScaleCTM(ctx, 1, -1);
      CGPoint origin = CGPointMake(-(self.size.width / 2.0), -(self.size.height / 2.0));
      CGRect rect = CGRectZero;
      rect.origin = origin;
      rect.size = self.size;
      CGContextDrawImage(ctx, rect, cgImage);
      UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
      UIGraphicsEndImageContext();
      return image ?: self;
    }
    
    @end
    

    Swift

    extension UIImage {
    
      func imageRotated(on degrees: CGFloat) -> UIImage {
        // Following code can only rotate images on 90, 180, 270.. degrees.
        let degrees = round(degrees / 90) * 90
        let sameOrientationType = Int(degrees) % 180 == 0
        let radians = CGFloat.pi * degrees / CGFloat(180)
        let newSize = sameOrientationType ? size : CGSize(width: size.height, height: size.width)
    
        UIGraphicsBeginImageContext(newSize)
        defer {
          UIGraphicsEndImageContext()
        }
    
        guard let ctx = UIGraphicsGetCurrentContext(), let cgImage = cgImage else {
          return self
        }
    
        ctx.translateBy(x: newSize.width / 2, y: newSize.height / 2)
        ctx.rotate(by: radians)
        ctx.scaleBy(x: 1, y: -1)
        let origin = CGPoint(x: -(size.width / 2), y: -(size.height / 2))
        let rect = CGRect(origin: origin, size: size)
        ctx.draw(cgImage, in: rect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        return image ?? self
      }
    
    }
    

提交回复
热议问题