通过 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

}

如果旋转的角度能被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

以上所述是小编给大家介绍的iOS 图片旋转方法实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

ios 图片逆时针旋转_iOS 图片旋转方法实例代码相关推荐

  1. div旋转 vue_Vue实现按钮旋转和移动位置的实例代码

    1.静态效果图 Chrom移动端浏览模式下可拖动按钮处于任意位置,并且点击可旋转按钮 2.代码 export default { name: 'App', data(){ return{ /*---- ...

  2. java屏蔽虚拟按键代码_Android 中隐藏虚拟按键的方法实例代码

    下面通过一段代码给大家讲解android 隐藏虚拟按键的方法,废话不多说了,大家多多看看代码和注释吧,具体代码如下所示: /** * 隐藏虚拟按键,并且全屏 */ protected void hid ...

  3. vue中 点击事件的写法_vue实现绑定事件的方法实例代码详解

    一.前言 vuejs中的事件绑定,使用来完成的,这里函数名是定义在Vue实例中的methods对象中的,Vue实例可以直接访问其中的方法. 二.事件绑定方式 1. 直接在标签中写js方法 执行方法的第 ...

  4. ios xib 初始化高度_iOS图片伸缩技巧

    纵观移动市场,一款移动app,要想长期在移动市场立足,最起码要包含以下几个要素:实用的功能.极强的用户体验.华丽简洁的外观.华丽外观的背后,少不了美工的辛苦设计,但如果开发人员不懂得怎么合理展示这些设 ...

  5. ios 图片裁剪框架_iOS 图片裁剪与修改

    最近做的项目中需要上传头像,发表内容的时候也要涉及到图片上传,我直接用的原图上传,但是由于公司网络差,原图太大,老是加载好久好久,所以需要把原图裁剪或者修改分辨率之后再上传,找了好久,做了很多尝试才解 ...

  6. java 判断图片格式_Java判断上传图片格式的实例代码

    先给大家介绍下java判断上传图片格式. 由于客户上传图片将png的图片的后缀名改为jpg,所以通过后缀名判断不行,用下面这个方法可以 //判断是否是JPG格式 log.info("-1-- ...

  7. html动态散花代码,IOS实现签到特效(散花效果)的实例代码

    本文讲述了IOS实现签到特效(散花效果)实例代码.分享给大家供大家参考,具体如下: 散花特效 #import /// 领取奖励成功 @interface RewardSuccess : NSObjec ...

  8. ios 裁剪框大小_ios 图片裁剪修改尺寸的方法总结

    目前使用过的图片裁剪方法 1.等比例压缩 裁剪出的图片是以asize最小值为边框的正方形图片 //修改图片尺寸同比缩放 + (UIImage*)thumbnailWithImageWithoutSca ...

  9. ios 图片居中裁剪_IOS图片裁剪和小图看大图动画

    IOS的UIImagePickerController可以让用户通过相机或者相册获取想要的图片,并且通过设置allowsEditing属性允许用户在选择了图片以后对图片进行裁剪.不过在某些时候会出现正 ...

  10. ios 图片裁剪框架_iOS图片裁剪器 – RSKImageCropper

    RSKImageCropper iOS图片裁剪器,类似Contacts应用中的图片定位美化. 基础使用方法 导入类header. #import Just create a view controll ...

最新文章

  1. OpenCV中的快速特征检测——FAST(Features from Accelerated Segment Test)
  2. iOS之CAEmitterLayer粒子引擎
  3. torchnet package (2)
  4. 服务器和客户端之间的变量交互
  5. java nio doug_深入的聊聊 Java NIO
  6. MongoDB 插入文档
  7. Linux学习之CentOS(三十三)--DNS基础及域名系统架构
  8. Android WebView中图片自适应居中
  9. 罗技 连点 脚本_罗技 G502 无线版体验:告别了线材,而且变得更轻了
  10. 随手记:Ubuntu16.04.1安装Chrome浏览器以及解决root下无法启动的问题
  11. Linux下载Java包,Linux环境Java包的安装和环境配置
  12. PHP、MySQL分库分表中间件、支持协程
  13. 04---项目后端业务实现
  14. 4.8 HD-GR GNSS导航软件源码
  15. grpc报错rpc error:code=DeadlineExceeded desc = context deadline exceeded
  16. 手机连上蓝牙耳机没有声音
  17. UVM基本介绍(UVM class hierarchy、验证平台、树状图)
  18. 使用XML表达表格数据
  19. PEEK薄膜特性与各型号性能特征分析
  20. 关于电影票对接公众号cps

热门文章

  1. 计算机程序设计语言有哪几类,计算机程序设计语言可以分为哪三类?
  2. java 1.4 下载_j2sdk1.4.2
  3. 漏洞 立即留言_ASPCMS留言板漏洞注入一句话木马插入数据库及修复方法
  4. 数据结构c语言版编程软件,数据结构严蔚敏4版PDF下载_数据结构C语言版严蔚敏下载 完整版_当载软件站...
  5. centos 安装LibreOffice word转PDF导出
  6. Android 实现基于RTMP视频播放
  7. 单片机c语言编程实训心得,单片机实训心得体会
  8. 【Redis系列】Redis常用数据类型命令大全,6K字爆肝整理,路过不容错过
  9. 研究生们都在推荐哪些好用的论文在线翻译软件?
  10. matlab2016a下载包及安装教程