iOS图片旋转与镜像-UIImage rotation and mirroring

// UKImage.h -- extra UIImage methods
// by allen brunson  march 29 2009

#ifndef UKIMAGE_H
#define UKIMAGE_H

#import 

@interface UIImage (UKImage)

-(UIImage*)rotate:(UIImageOrientation)orient;

@end

#endif  // UKIMAGE_H

// UKImage.mm -- extra UIImage methods
// by allen brunson  march 29 2009
// based on original code by Kevin Lohman:
// http://blog.logichigh.com/2008/06/05/uiimage-fix/

#include "UKImage.h"

static CGRect swapWidthAndHeight(CGRect rect)
{
    CGFloat  swap = rect.size.width;
    
    rect.size.width  = rect.size.height;
    rect.size.height = swap;
    
    return rect;
}

@implementation UIImage (UKImage)

-(UIImage*)rotate:(UIImageOrientation)orient
{
    CGRect             bnds = CGRectZero;
    UIImage*           copy = nil;
    CGContextRef       ctxt = nil;
    CGImageRef         imag = self.CGImage;
    CGRect             rect = CGRectZero;
    CGAffineTransform  tran = CGAffineTransformIdentity;

    rect.size.width  = CGImageGetWidth(imag);
    rect.size.height = CGImageGetHeight(imag);
    
    bnds = rect;
     switch (orient)
    {
          case UIImageOrientationUp:  
                  // would get you an exact copy of the original  
                  [assert](false);
                   return  nil;
        case UIImageOrientationUpMirrored:
                tran = CGAffineTransformMakeTranslation(rect.size.width, 0.0);
                tran = CGAffineTransformScale(tran, -1.0, 1.0);
                break;

        case UIImageOrientationDown:
                tran = CGAffineTransformMakeTranslation(rect.size.width,rect.size.height);
                tran = CGAffineTransformRotate(tran, M_PI);
                break;

        case UIImageOrientationDownMirrored:
                tran = CGAffineTransformMakeTranslation(0.0, rect.size.height);
                tran = CGAffineTransformScale(tran, 1.0, -1.0);
                break;
        case UIImageOrientationLeft:
                bnds = swapWidthAndHeight(bnds);
                tran = CGAffineTransformMakeTranslation(0.0, rect.size.width);
                tran = CGAffineTransformRotate(tran, 3.0 * M_PI / 2.0);
                break;

        case UIImageOrientationLeftMirrored:
                bnds = swapWidthAndHeight(bnds);
                tran = CGAffineTransformMakeTranslation(rect.size.height,rect.size.width);
                tran = CGAffineTransformScale(tran, -1.0, 1.0);
                tran = CGAffineTransformRotate(tran, 3.0 * M_PI / 2.0);
                break;

        case UIImageOrientationRight:
                bnds = swapWidthAndHeight(bnds);
                tran = CGAffineTransformMakeTranslation(rect.size.height, 0.0);
                tran = CGAffineTransformRotate(tran, M_PI / 2.0);
                break;

        case UIImageOrientationRightMirrored:
                 bnds = swapWidthAndHeight(bnds);
                 tran = CGAffineTransformMakeScale(-1.0, 1.0);
                 tran = CGAffineTransformRotate(tran, M_PI / 2.0);
                break;

      default:  
      // orientation value supplied is invalid  
      [assert](false); 
      return  nil;

    }

    UIGraphicsBeginImageContext(bnds.size);
    ctxt = UIGraphicsGetCurrentContext();
    switch (orient)
    {
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
        CGContextScaleCTM(ctxt, -1.0, 1.0);
        CGContextTranslateCTM(ctxt, -rect.size.height, 0.0);
        break;
        
        default:
        CGContextScaleCTM(ctxt, 1.0, -1.0);
        CGContextTranslateCTM(ctxt, 0.0, -rect.size.height);
        break;
    }
  
    CGContextConcatCTM(ctxt, tran);
    CGContextDrawImage(UIGraphicsGetCurrentContext(), rect, imag);
    
    copy = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return copy;

}

@end

转自UIImage rotation and mirroring

你可能感兴趣的:(iOS图片旋转与镜像-UIImage rotation and mirroring)