一个图片旋转的函数

简介: -(UIImage *)rotateImage:(UIImage *)aImage {     CGImageRef imgRef = aImage.CGImage;     CGFloat width = CGImageGetWidth(imgRef);     CGFloat height = CGImageGetHeight(imgRef);     CGAf

-(UIImage *)rotateImage:(UIImage *)aImage

{

    CGImageRef imgRef = aImage.CGImage;

    CGFloat width = CGImageGetWidth(imgRef);

    CGFloat height = CGImageGetHeight(imgRef);

    CGAffineTransform transform = CGAffineTransformIdentity;

    CGRect bounds = CGRectMake(0, 0, width, height);

    CGFloat scaleRatio = 1;

    CGFloat boundHeight;

    UIImageOrientation orient = aImage.imageOrientation;

    switch(orient)

    {

        case UIImageOrientationUp: //EXIF = 1

            transform = CGAffineTransformIdentity;

            break;

        case UIImageOrientationUpMirrored: //EXIF = 2

            transform = CGAffineTransformMakeTranslation(width, 0.0);

            transform = CGAffineTransformScale(transform, -1.0, 1.0);

            break;

        case UIImageOrientationDown: //EXIF = 3

            transform = CGAffineTransformMakeTranslation(width, height);

            transform = CGAffineTransformRotate(transform, M_PI);

            break;

        case UIImageOrientationDownMirrored: //EXIF = 4

            transform = CGAffineTransformMakeTranslation(0.0, height);

            transform = CGAffineTransformScale(transform, 1.0, -1.0);

            break;

        case UIImageOrientationLeftMirrored: //EXIF = 5

            boundHeight = bounds.size.height;

            bounds.size.height = bounds.size.width;

            bounds.size.width = boundHeight;

            transform = CGAffineTransformMakeTranslation(height, width);

            transform = CGAffineTransformScale(transform, -1.0, 1.0);

            transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);

            break;

        case UIImageOrientationLeft: //EXIF = 6

            boundHeight = bounds.size.height;

            bounds.size.height = bounds.size.width;

            bounds.size.width = boundHeight;

            transform = CGAffineTransformMakeTranslation(0.0, width);

            transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);

            break;

        case UIImageOrientationRightMirrored: //EXIF = 7

            boundHeight = bounds.size.height;

            bounds.size.height = bounds.size.width;

            bounds.size.width = boundHeight;

            transform = CGAffineTransformMakeScale(-1.0, 1.0);

            transform = CGAffineTransformRotate(transform, M_PI / 2.0);

            break;

        case UIImageOrientationRight: //EXIF = 8

            boundHeight = bounds.size.height;

            bounds.size.height = bounds.size.width;

            bounds.size.width = boundHeight;

            transform = CGAffineTransformMakeTranslation(height, 0.0);

            transform = CGAffineTransformRotate(transform, M_PI / 2.0);

            break;

        default:

            [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"];

    }

    UIGraphicsBeginImageContext(bounds.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) {

        CGContextScaleCTM(context, -scaleRatio, scaleRatio);

        CGContextTranslateCTM(context, -height, 0);

    }

    else {

        CGContextScaleCTM(context, scaleRatio, -scaleRatio);

        CGContextTranslateCTM(context, 0, -height);

    }

    CGContextConcatCTM(context, transform);

    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef);

    UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return imageCopy;

}

目录
相关文章
|
测试技术 程序员 C++
iOS:项目中无用类检测和无用图片检测汇总
在涉及到项目大改版,或者涉及到某个功能模块大变更,就会涉及到图片废弃和文件废弃的情况。 但是这时候就会遗留下一个很大的问题,没有将废弃的、无用的文件类或资源删除干净。而这次需要对工程代码的无用资源和无用文件进行删除处理,感触颇多,故在此笔记。 首先,感觉很多人的代码习惯还是恶待提高。比如我发现一些人的代码操作习惯,从好到次,可以大略分以下情况
1505 0
iOS:项目中无用类检测和无用图片检测汇总
|
iOS开发
iOS 动画绘制圆形
iOS 动画绘制圆形
156 1
|
8月前
|
人工智能 自然语言处理 达摩院
VideoLLaMA3:阿里达摩院开源专注于视觉理解的多模态基础模型,具备多语言视频理解能力
VideoLLaMA3 是阿里巴巴开源的多模态基础模型,专注于图像和视频理解,支持多语言生成、视频内容分析和视觉问答任务,适用于多种应用场景。
516 6
|
容器
Vue3回到顶部(BackTop)
这是一个基于 Vue3 的头像组件库,提供了圆形和方形两种头像形状,并支持自定义大小、图片、图标及字符展示。
194 0
Vue3回到顶部(BackTop)
Java系类 之 生成随机数(random()和Random类)
这篇文章介绍了Java中生成随机数的两种方法:使用`Math.random()`方法和`Random`类的实例方法,并提供了示例代码展示如何使用这些方法生成特定范围或特定条件下的随机数。
|
存储 SQL 人工智能
数据库技术:从核心原理到行业应用
一、引言 数据库技术作为现代信息技术的基石,在各行各业中发挥着至关重要的作用
|
Android开发
Android android:exported="true" 属性
Android android:exported="true" 属性
1930 0
|
定位技术
ArcGIS中ERROR 999999报错Configuration RasterCommander ImageServer can not be started解决
ArcGIS中ERROR 999999报错Configuration RasterCommander ImageServer can not be started解决
595 1
|
存储 监控 编译器
【C语言进阶】函数栈帧的创建和销毁(内功修炼)
目录 前言 一、基础知识 1.1 什么是栈区? 1.2 寄存器 1.3 测试代码和一些其它的 二、函数栈帧的创建和销毁的过程 2.1 _tmainCRTStartup函数(调用main函数)栈帧的创建 2.2 main函数栈帧的创建 2.3 main函数内执行有效代码 2.4 Add函数栈帧的创建 2.5 Add函数内执行有效代码 2.6 Add函数栈帧的销毁 2.7 main函数代码继续执行 三、所需反汇编代码总览 四、总结
436 0
【C语言进阶】函数栈帧的创建和销毁(内功修炼)