iOS 图片旋转方法
更多图片处理方法见图片组件 BBWebImage
iOS 图片旋转方法
通过 CGImage 或 CIImage 旋转特定角度
UIImage可通过CGImage或CIImage初始化,初始化方法分别为init(cgImage: CGImage, scale: CGFloat, orientation: UIImageOrientation)和init(ciImage: CIImage, scale: CGFloat, orientation: UIImageOrientation)。通过UIImageOrientation的不同取值,可以使图片旋转90、180、270度。
用原图绘制
通过原图绘制实现旋转图片任意角度。可以先绘制红色背景,效果如下

static func rotateImage(_ image: UIImage, withAngle angle: Double) -> UIImage? {
if angle.truncatingRemainder(dividingBy: 360) == 0 { return image }
let imageRect = CGRect(origin: .zero, size: image.size)
let radian = CGFloat(angle / 180 * M_PI)
let rotatedTransform = CGAffineTransform.identity.rotated(by: radian)
var rotatedRect = imageRect.applying(rotatedTransform)
rotatedRect.origin.x = 0
rotatedRect.origin.y = 0
UIGraphicsBeginImageContext(rotatedRect.size)
guard let context = UIGraphicsGetCurrentContext() else { return nil }
context.translateBy(x: rotatedRect.width / 2, y: rotatedRect.height / 2)
context.rotate(by: radian)
context.translateBy(x: -image.size.width / 2, y: -image.size.height / 2)
image.draw(at: .zero)
let rotatedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return rotatedImage
}
angle表示需要旋转的角度,单位是度,正值表示图片顺时针方向旋转。如果旋转的角度能被360整除,则不需要旋转,直接返回原图。如果是其他角度,需要进行绘制。
绘制首先要获取原点为零、大小为原图大小的CGRect,用imageRect表示。CGAffineTransform.identity获得单位矩阵。CGAffineTransform的rotated(by angle: CGFloat) -> CGAffineTransform方法将矩阵旋转一定角度,返回旋转后的矩阵。角度采用弧度制,正值为逆时针方向,负值为顺时针方向。CGRect的applying(_ t: CGAffineTransform) -> CGRect方法将旋转后的矩阵用于imageRect,返回包含imageRect旋转后的最小CGRect,用rotatedRect表示,作为位图大小。rotatedRect的原点可能不为零,需要置为零。
位图的CGContext以原点为轴旋转。为了使图片以中心为轴旋转,先把CGContext的原点移至中心context.translateBy(x: rotatedRect.width / 2, y: rotatedRect.height / 2),然后再旋转context.rotate(by: radian)。CGContext的rotate(by angle: CGFloat)方法也是采用弧度制,正值表示context逆时针方向旋转,绘制出来的效果为图片顺时针方向旋转。此时,context的原点在位图的中心,需要按照原图大小的一半进行位移,context.translateBy(x: -image.size.width / 2, y: -image.size.height / 2),使整张图从原点绘制后图的中心在位图区域的中心。
如果要得到红色背景,则在取得context后立即填充红色,即在guard let context = UIGraphicsGetCurrentContext() else { return nil }后加上
UIColor.red.setFill()
context.fill(rotatedRect)
通过 CALayer 绘制
可以将图片放在UIView上,用CALayer绘制旋转后的图片。
static func rotateImage(_ image: UIImage, withAngle angle: Double) -> UIImage? {
if angle.truncatingRemainder(dividingBy: 360) == 0 { return image }
let imageView = UIImageView(image: image)
imageView.transform = CGAffineTransform.identity.rotated(by: CGFloat(angle / 180 * M_PI))
let rotatedRect = imageView.bounds.applying(imageView.transform)
let containerView = UIView(frame: CGRect(origin: .zero, size: rotatedRect.size))
imageView.center = containerView.center
containerView.addSubview(imageView)
UIGraphicsBeginImageContext(containerView.bounds.size)
guard let context = UIGraphicsGetCurrentContext() else { return nil }
containerView.layer.render(in: context)
let rotatedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return rotatedImage
}
将原图放入UIImageView,用imageView表示,然后进行矩阵旋转。获取旋转后的CGRect,创建一个相同大小的UIView,用containerView表示,作为imageView的父视图(superview)。将imageView居中放置。用containerView的layer进行绘制。
如果要得到红色背景,则在创建containerView后设置背景色,即在let containerView = UIView(frame: CGRect(origin: .zero, size: rotatedRect.size))后加上
containerView.backgroundColor = .red
转载请注明出处:http://www.cnblogs.com/silence-cnblogs/p/6496564.html
iOS 图片旋转方法的更多相关文章
- iOS 图片压缩方法
iOS 图片压缩方法 两种图片压缩方法 两种压缩图片的方法:压缩图片质量(Quality),压缩图片尺寸(Size). 压缩图片质量 NSData *data = UIImageJPEGReprese ...
- iOS 图片裁剪方法
iOS 图片裁剪方法 通过 CGImage 或 CIImage 裁剪 UIImage有cgImage和ciImage属性,分别可以获得CGImage和CIImage对象.CGImage和CIImage ...
- [转]常用iOS图片处理方法
自:http://blog.sina.com.cn/s/blog_8988732e0100xcx1.html ========== (one) UIImage 图像 等比例缩放=========== ...
- ios 图片拉伸方法
前提:要注意图片的size和展示的图片view的size的大小. 假如图片高度50,展示图片view的高度30,拉伸会变成剪切. 如果图片尺寸不对,可以用mac自带的图片编辑器修改大小: 双击打开图 ...
- php处理IOS图片旋转
$picAddr = $url; $exif = exif_read_data($picAddr); $image = imagecreatefromjpeg($picAddr); if($exif[ ...
- iOS 图片裁剪 + 旋转
iOS 图片裁剪 + 旋转 之前分别介绍了图片裁剪和图片旋转方法 <iOS 图片裁剪方法> 地址:http://www.cnblogs.com/silence-cnblogs/p/6490 ...
- ios手机竖屏拍照图片旋转90°问题解决方法
手机拍照会给图片添加一个Orientaion信息(即拍照方向),如下: 用ios手机拍照,系统会给图片加上一个方向的属性, ios相机默认的拍照方向是后摄Home键在右为正,前摄Home键在左为正. ...
- js 前端图片压缩+ios图片角度旋转
step1:读取选择的图片,并转为base64: function ImgToBase64 (e, fn) { // 图片方向角 //fn为传入的方法函数,在图片操作完成之后执行 var Orient ...
- iOS图片上传后被旋转的问题
最近用PHP做了一个图片合成程序,前端是通过HTML的file input选取自定图片,POST到php后台调整尺寸后与事先准备好的背景图进行合成. 通过测试发现,上传后的自定图片有的被旋转了,有的是 ...
随机推荐
- [原]崩溃在ole32!CStdMarshal::DisconnectSrvIPIDs
最近项目里遇到一个崩溃,不定期出现,很是头疼!今晚终于忍无可忍,下决心要干掉它!(于是用凉水洗了把脸,开始分析dump)希望凌晨的这篇总结对有相似经历的朋友有所启发!(看之前相关的几个dump可以猜到 ...
- 后端数据库使用 Bomb方案
不再需要阿里云进行部署: http://docs.bmob.cn/ios/faststart/index.html?menukey=fast_start&key=start_ios
- iOS 之 获取View所在控制器
1. UIResponder UIViewController *uvc; UIResponder* nextResponder = [self.superview.superview.supervi ...
- 用mui框架开发手机app项目实践中的那些事儿
http://www.yilingsj.com/xwzj/2015-04-29/260.html 最近在玩mui框架,坑的我是:西湖的水,全都是眼泪!!! 公司的手机app要进行改版,我率先想到的是j ...
- js原生设计模式——7原型模式之真正的原型模式——对象复制封装
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- jQuery插件Flot实战Demo
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- 建立、配置和使用Activity——启动、关闭Activity
一个Android应用通常都会包含多个Activity,但只有一个Activity会作为程序的入口——当该Android应用运行时将会自启动并执行该Activity.至于应用中的其他Activity, ...
- 表单验证--通过原生js模仿ajax的异步交互
今天给大家带来个福利,我也是刚刚学习的很实用的一个东西,通过原生js模仿ajax的异步交互. 我的博客只是给那些新手看的大神勿喷,写的不好可留言,请指出. 因为当初自己学的时候一个问题不会找人问,知道 ...
- SSM框架整合(注解)-Spring+SpringMVC+MyBatis+MySql
准备工作: 下载整合所需的jar包 点击此处下载 使用MyBatis Generator生成dao接口.映射文件和实体类 如何生成 搭建过程: 先来看一下项目的 目录结构 1.配置dispatcher ...
- 访问 Neutron 外部网络 - 每天5分钟玩转 OpenStack(143)
前面我们学习了位于不同 Neutron subnet 的 instance 可以通过 router 通信,今天开始讨论 instance 如何访问外部网络. 这里的外部网络是指的租户网络以外的网络.租 ...