通过 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手势识别的详细使用方法(拖动
# 缩放
# 旋转
# 点击
# 手势依赖
# 自定义手势)
# iOS拍照后图片自动旋转90度的完美解决方法
# JS解决IOS中拍照图片预览旋转90度BUG的问题
# iOS 图片裁剪 + 旋转
# iOS应用开发中使用UIScrollView控件来实现图片缩放
# iOS利用UIScrollView实现图片的缩放实例代码
# iOS中大尺寸图片的旋转与缩放实例详解
# 要得
# 则在
# 即在
# 小编
# 值为
# 为零
# 顺时针方向
# 放在
# 在此
# 不需要
# 给大家
# 然后再
# 分别为
# 不为
# 先把
# 可通过
# 所述
# 创建一个
# 给我留言
# 整张
相关文章:
中山网站推广排名,中山信息港登录入口?
如何在腾讯云服务器快速搭建个人网站?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
贸易公司网站制作流程,出口贸易网站设计怎么做?
如何选择适合PHP云建站的开源框架?
如何通过智能用户系统一键生成高效建站方案?
电商网站制作公司有哪些,1688网是什么意思?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
如何在建站主机中优化服务器配置?
建站之星如何助力网站排名飙升?揭秘高效技巧
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
,有什么在线背英语单词效率比较高的网站?
购物网站制作公司有哪些,哪个购物网站比较好?
如何快速搭建自助建站会员专属系统?
ppt制作免费网站有哪些,ppt模板免费下载网站?
网站app免费制作软件,能免费看各大网站视频的手机app?
如何用腾讯建站主机快速创建免费网站?
建站之星与建站宝盒如何选择最佳方案?
如何选择高效响应式自助建站源码系统?
如何通过IIS搭建网站并配置访问权限?
青浦网站制作公司有哪些,苹果官网发货地是哪里?
盐城做公司网站,江苏电子版退休证办理流程?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
如何在IIS中新建站点并配置端口与IP地址?
再谈Python中的字符串与字符编码(推荐)
如何设置并定期更换建站之星安全管理员密码?
如何快速生成专业多端适配建站电话?
c# await 一个已经完成的Task会发生什么
如何在IIS中配置站点IP、端口及主机头?
如何快速搭建高效简练网站?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
如何在云主机上快速搭建多站点网站?
如何快速搭建响应式可视化网站?
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?
如何在建站宝盒中设置产品搜索功能?
小型网站建站如何选择虚拟主机?
简单实现Android验证码
济南专业网站制作公司,济南信息工程学校怎么样?
seo网站制作优化,网站SEO优化步骤有哪些?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
韩国服务器如何优化跨境访问实现高效连接?
Swift中循环语句中的转移语句 break 和 continue
网站制作软件有哪些,制图软件有哪些?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
高端建站三要素:定制模板、企业官网与响应式设计优化
小建面朝正北,A点实际方位是否存在偏差?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
*请认真填写需求信息,我们会在24小时内与您取得联系。