// // UIImage+Orientation.m // iOS-Categories (https://github.com/shaojiankui/iOS-Categories) // // Created by Jakey on 15/1/4. // Copyright (c) 2015年 www.skyfox.org. All rights reserved. // #import "UIImage+Orientation.h" @implementation UIImage (Orientation) /** * @brief 修正图片的方向 * * @param srcImg 图片 * * @return 修正方向后的图片 */ + (UIImage *)fixOrientation:(UIImage *)srcImg { if (srcImg.imageOrientation == UIImageOrientationUp) return srcImg; CGAffineTransform transform = CGAffineTransformIdentity; switch (srcImg.imageOrientation) { case UIImageOrientationDown: case UIImageOrientationDownMirrored: transform = CGAffineTransformTranslate(transform, srcImg.size.width, srcImg.size.height); transform = CGAffineTransformRotate(transform, M_PI); break; case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: transform = CGAffineTransformTranslate(transform, srcImg.size.width, 0); transform = CGAffineTransformRotate(transform, M_PI_2); break; case UIImageOrientationRight: case UIImageOrientationRightMirrored: transform = CGAffineTransformTranslate(transform, 0, srcImg.size.height); transform = CGAffineTransformRotate(transform, -M_PI_2); break; case UIImageOrientationUp: case UIImageOrientationUpMirrored: break; } switch (srcImg.imageOrientation) { case UIImageOrientationUpMirrored: case UIImageOrientationDownMirrored: transform = CGAffineTransformTranslate(transform, srcImg.size.width, 0); transform = CGAffineTransformScale(transform, -1, 1); break; case UIImageOrientationLeftMirrored: case UIImageOrientationRightMirrored: transform = CGAffineTransformTranslate(transform, srcImg.size.height, 0); transform = CGAffineTransformScale(transform, -1, 1); break; case UIImageOrientationUp: case UIImageOrientationDown: case UIImageOrientationLeft: case UIImageOrientationRight: break; } CGContextRef ctx = CGBitmapContextCreate(NULL, srcImg.size.width, srcImg.size.height, CGImageGetBitsPerComponent(srcImg.CGImage), 0, CGImageGetColorSpace(srcImg.CGImage), CGImageGetBitmapInfo(srcImg.CGImage)); CGContextConcatCTM(ctx, transform); switch (srcImg.imageOrientation) { case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: case UIImageOrientationRight: case UIImageOrientationRightMirrored: CGContextDrawImage(ctx, CGRectMake(0,0,srcImg.size.height,srcImg.size.width), srcImg.CGImage); break; default: CGContextDrawImage(ctx, CGRectMake(0,0,srcImg.size.width,srcImg.size.height), srcImg.CGImage); break; } CGImageRef cgimg = CGBitmapContextCreateImage(ctx); UIImage *img = [UIImage imageWithCGImage:cgimg]; CGContextRelease(ctx); CGImageRelease(cgimg); return img; } - (UIImage *)flip:(BOOL)isHorizontal { CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height); UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0); CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextClipToRect(ctx, rect); if (isHorizontal) { CGContextRotateCTM(ctx, M_PI); CGContextTranslateCTM(ctx, -rect.size.width, -rect.size.height); } CGContextDrawImage(ctx, rect, self.CGImage); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } /** * @brief 垂直翻转 * * @return 翻转后的图片 */ - (UIImage *)flipVertical { return [self flip:NO]; } /** * @brief 水平翻转 * * @return 翻转后的图片 */ - (UIImage *)flipHorizontal { return [self flip:YES]; } /** * @brief 旋转图片 * * @param degrees 弧度 * * @return 旋转后图片 */ - (UIImage *)imageRotatedByRadians:(CGFloat)radians { return [self imageRotatedByDegrees:[UIImage radiansToDegrees:radians]]; } /** * @brief 旋转图片 * * @param degrees 度 * * @return 旋转后图片 */ - (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([UIImage 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, [UIImage 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; } /** * @brief 角度转弧度 * * @param degrees 角度 * * @return 弧度 */ +(CGFloat)degreesToRadians:(CGFloat)degrees { return degrees * M_PI / 180; } /** * @brief 弧度转角度 * * @param radians 弧度 * * @return 角度 */ +(CGFloat)radiansToDegrees:(CGFloat)radians { return radians * 180/M_PI; } @end