全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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
}

如果旋转的角度能被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中大尺寸图片的旋转与缩放实例详解  # 要得  # 则在  # 即在  # 小编  # 值为  # 为零  # 顺时针方向  # 放在  # 在此  # 不需要  # 给大家  # 然后再  # 分别为  # 不为  # 先把  # 可通过  # 所述  # 创建一个  # 给我留言  # 整张 


相关文章: 合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  建站之星如何助力网站排名飙升?揭秘高效技巧  如何快速搭建响应式可视化网站?  西安大型网站制作公司,西安招聘网站最好的是哪个?  如何在万网自助建站中设置域名及备案?  python的本地网站制作,如何创建本地站点?  建站之星如何快速更换网站模板?  网站制作员失业,怎样查看自己网站的注册者?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  建站VPS推荐:2025年高性能服务器配置指南  建站三合一如何选?哪家性价比更高?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  建站之星北京办公室:智能建站系统与小程序生成方案解析  音乐网站服务器如何优化API响应速度?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  深入理解Android中的xmlns:tools属性  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  济南网站制作的价格,历城一职专官方网站?  *服务器网站为何频现安全漏洞?  如何在服务器上三步完成建站并提升流量?  简历在线制作网站免费版,如何创建个人简历?  南平网站制作公司,2025年南平市事业单位报名时间?  如何用wdcp快速搭建高效网站?  Android自定义控件实现温度旋转按钮效果  网站制作公司排行榜,抖音怎样做个人官方网站  c# 在高并发场景下,委托和接口调用的性能对比  如何快速上传自定义模板至建站之星?  如何访问已购建站主机并解决登录问题?  javascript中对象的定义、使用以及对象和原型链操作小结  制作营销网站公司,淘特是干什么用的?  太平洋网站制作公司,网络用语太平洋是什么意思?  Swift中switch语句区间和元组模式匹配  建站主机是否属于云主机类型?  制作网页的网站有哪些,电脑上怎么做网页?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  建站之星如何实现网站加密操作?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何通过网站建站时间优化SEO与用户体验?  网站微信制作软件,如何制作微信链接?  高端建站三要素:定制模板、企业官网与响应式设计优化  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  如何零成本快速生成个人自助网站?  建站之星备案是否影响网站上线时间?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  做企业网站制作流程,企业网站制作基本流程有哪些?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。