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后台调整尺寸后与事先准备好的背景图进行合成. 通过测试发现,上传后的自定图片有的被旋转了,有的是 ...
随机推荐
- 一段神奇的代码-关于PHP字符变量奇怪现象的解释
首先神奇的PHP是支持字符数据类型的,有同学就写了这样一段代码: for ($c = 'a'; $c <= 'z'; $c++) { echo $c . ' '; } 然而结果却不是他想要的a到 ...
- 2.9. Scalar Properties for Primitive Data Types 选项(Core Data 应用程序实践指南)
该选项的意思是,“用Scalar特性来表示原始数据类型”.什么意思,妈妈米呀,这是我学这门课程遇到的最难懂的概念. scalar properties,是复数,也就是说是 “分等级的属性”.那么,大概 ...
- origin添加error bar
增加一列,然后set as Y Error,然后全部选中显示就行了.
- html中object标签详解
定义和用法 object标签定义一个嵌入的对象.请使用此元素向您的 XHTML 页面添加多媒体.此元素允许您规定插入 HTML 文档中的对象的数据和参数,以及可用来显示和操作数据的代码. &l ...
- xhtmlrenderer渲染pdf,中文换行
在实际开发中,发现在table中显示中文,渲染出来的pdf,中文内容不自动换行.经过搜索发现了一种解决方案,如下: 重写Breaker,修改right计算方式 /* * Breaker.java * ...
- HTML 布局
网站布局 大多数网站会把内容安排到多个列中(就像杂志或报纸那样). 大多数网站可以使用 <div> 或者 <table> 元素来创建多列.CSS 用于对元素进行定位,或者为页面 ...
- easyUI panel组件
easyUI panel组件: 属性的使用: <!DOCTYPE html> <html lang="en"> <head> <meta ...
- SuperSocket入门(二)- 探索AppServer、AppSession,Conmmand和App.config
在上一篇文章中,我们已经了解到了如何在SuperSocket处理客户端请求. 同时我们可能会发现一个问题,如果我们的服务器端包含有很多复杂的业务逻辑,这样的switch/case代码将会很 ...
- Java程序打开指定地址网页
1.今天遇到了需要手动输入http地址打开指定网页的需求,试着做一个用程序打开指定网页的功能,搜了一下,还真有一个现成的例子,稍加改造,实现自己的需求: 2.代码不多,两个文件:如下: package ...
- jmeter线程组配置
线程组配置 线程组相当于有多个用户,同时去执行相同的一批次任务.每个线程之间都是隔离的,互不影响的.一个线程的执行过程中,操作的变量,不会影响其他线程的变量值. Delay Thread creati ...