UIImage+Ext.swift 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. //
  2. // UIImage+Ext.swift
  3. // PQSpeed
  4. //
  5. // Created by SanW on 2020/6/19.
  6. // Copyright © 2020 BytesFlow. All rights reserved.
  7. //
  8. import Foundation
  9. extension UIImage {
  10. func cropImage(ratio: CGFloat) -> UIImage {
  11. // 计算最终尺寸
  12. let newSize: CGSize = CGSize(width: size.width, height: size.width * ratio)
  13. // 图片绘制区域
  14. var rect = CGRect.zero
  15. rect.size.width = size.width
  16. rect.size.height = size.height
  17. rect.origin.x = (newSize.width - size.width) / 2.0
  18. rect.origin.y = (newSize.height - size.height) / 2.0
  19. UIGraphicsBeginImageContext(newSize)
  20. draw(in: rect)
  21. let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
  22. UIGraphicsEndImageContext()
  23. return scaledImage!
  24. }
  25. func cropImage(newSize: CGSize) -> UIImage {
  26. //// 图片绘制区域
  27. var rect = CGRect.zero
  28. rect.size.width = newSize.width
  29. rect.size.height = newSize.width * (size.height / size.width)
  30. // 绘制并获取最终图片
  31. UIGraphicsBeginImageContext(newSize)
  32. draw(in: rect)
  33. let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
  34. UIGraphicsEndImageContext()
  35. return scaledImage!
  36. }
  37. func imageWithImage(scaledToSize newSize: CGSize) -> UIImage {
  38. UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
  39. draw(in: CGRect(origin: CGPoint.zero, size: newSize))
  40. let newImage = UIGraphicsGetImageFromCurrentImageContext() ?? self
  41. UIGraphicsEndImageContext()
  42. return newImage
  43. }
  44. /// 旋转角度
  45. /// - Parameter image: <#image description#>
  46. /// - Returns: <#description#>
  47. func rotateImage(rotate: Int, originWidth: CGFloat, originHeight: CGFloat) -> UIImage {
  48. let rotate: CGFloat = CGFloat(3 * Double.pi / 2)
  49. let rect = CGRect(x: 0, y: 0, width: originWidth, height: originHeight)
  50. let translateX: CGFloat = -rect.size.height
  51. let translateY: CGFloat = 0
  52. let scaleY = rect.size.width / rect.size.height
  53. let scaleX = rect.size.height / rect.size.width
  54. UIGraphicsBeginImageContext(rect.size)
  55. let context = UIGraphicsGetCurrentContext()
  56. // context!.translateBy(x: 0.0, y: rect.size.height)
  57. // context!.scaleBy(x: 1.0, y: -1.0)
  58. context!.rotate(by: rotate)
  59. context!.translateBy(x: translateX, y: translateY)
  60. context!.scaleBy(x: scaleX, y: scaleY)
  61. draw(in: CGRect(x: 0, y: 0, width: rect.size.width, height: rect.size.height))
  62. return UIGraphicsGetImageFromCurrentImageContext()!
  63. }
  64. /// 生成三角图
  65. /// - Parameters:
  66. /// - size: <#size description#>
  67. /// - tintColor: <#tintColor description#>
  68. /// - convert:是否倒置
  69. /// - Returns: <#description#>
  70. class func triangleImage(size: CGSize, tintColor: UIColor, direction: moveDirection = .moveDirectionDown) -> UIImage {
  71. var startPoint: CGPoint = CGPoint.zero
  72. var middlePoint: CGPoint = CGPoint.zero
  73. var endPoint: CGPoint = CGPoint.zero
  74. switch direction {
  75. case .moveDirectionLeft:
  76. startPoint = CGPoint(x: size.width, y: 0)
  77. middlePoint = CGPoint(x: 0, y: size.height / 2.0)
  78. endPoint = CGPoint(x: size.width, y: size.height)
  79. case .moveDirectionRight:
  80. startPoint = CGPoint(x: 0, y: 0)
  81. middlePoint = CGPoint(x: size.width, y: size.height / 2.0)
  82. endPoint = CGPoint(x: 0, y: size.height)
  83. case .moveDirectionUp:
  84. startPoint = CGPoint(x: 0, y: size.height)
  85. middlePoint = CGPoint(x: size.width / 2.0, y: 0)
  86. endPoint = CGPoint(x: size.width, y: size.height)
  87. default:
  88. startPoint = CGPoint(x: 0, y: 0)
  89. middlePoint = CGPoint(x: size.width / 2.0, y: size.height)
  90. endPoint = CGPoint(x: size.width, y: 0)
  91. }
  92. UIGraphicsBeginImageContextWithOptions(size, false, 0)
  93. let ctx = UIGraphicsGetCurrentContext()
  94. let path = UIBezierPath()
  95. path.move(to: startPoint)
  96. path.addLine(to: middlePoint)
  97. path.addLine(to: endPoint)
  98. path.close()
  99. ctx?.setFillColor(tintColor.cgColor)
  100. path.fill()
  101. let image = UIGraphicsGetImageFromCurrentImageContext()!
  102. UIGraphicsEndImageContext()
  103. return image
  104. }
  105. /// 按照最短边缩放 add by ak
  106. /// - Parameter maxLength: 边长最大值
  107. func nx_scaleWithMaxLength(maxLength: CGFloat) -> UIImage {
  108. if size.width > maxLength || size.height > maxLength {
  109. var maxWidth: CGFloat = maxLength
  110. var maxHeight: CGFloat = maxLength
  111. if size.width != size.height {
  112. if size.width > size.height {
  113. // 按照宽 来缩放
  114. let imageScale: CGFloat = maxLength / size.width
  115. maxHeight = size.height * imageScale
  116. } else if size.width < size.height {
  117. let imageScale: CGFloat = maxLength / size.height
  118. maxWidth = size.width * imageScale
  119. }
  120. }
  121. // 返回新的改变大小后的图片
  122. return nx_scaleToSize(size: CGSize(width: maxWidth, height: maxHeight))
  123. }
  124. return self
  125. }
  126. /// 缩放到指定大小 add by ak
  127. /// - Parameter size: 新的大小
  128. func nx_scaleToSize(size: CGSize) -> UIImage {
  129. var width: CGFloat = CGFloat(cgImage!.width)
  130. var height: CGFloat = CGFloat(cgImage!.height)
  131. let verticalRadio: CGFloat = size.height * 1.0 / height
  132. let horizontalRadio: CGFloat = size.width * 1.0 / width
  133. var radio: CGFloat = 1
  134. if verticalRadio > 1, horizontalRadio > 1 {
  135. radio = verticalRadio > horizontalRadio ? horizontalRadio : verticalRadio
  136. } else {
  137. radio = verticalRadio < horizontalRadio ? verticalRadio : horizontalRadio
  138. }
  139. width = width * radio
  140. height = height * radio
  141. let xPos: CGFloat = (size.width - width) / 2
  142. let yPos: CGFloat = (size.height - height) / 2
  143. // 创建一个bitmap的context
  144. // 并把它设置成为当前正在使用的context
  145. UIGraphicsBeginImageContext(size)
  146. // 绘制改变大小的图片
  147. var rect = CGRect.zero
  148. rect.size.width = width
  149. rect.size.height = height
  150. rect.origin.x = xPos
  151. rect.origin.y = yPos
  152. draw(in: rect)
  153. // 从当前context中创建一个改变大小后的图片
  154. let scaledImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
  155. // 使当前的context出堆栈
  156. UIGraphicsEndImageContext()
  157. // 返回新的改变大小后的图片
  158. return scaledImage
  159. }
  160. // 将图片裁剪成指定比例(多余部分自动删除)let image3 = image.crop(ratio: 1) /将图片转成 1:1 比例(正方形)
  161. func nxcrop(ratio: CGFloat) -> UIImage {
  162. // 计算最终尺寸
  163. var newSize: CGSize!
  164. if size.width / size.height > ratio {
  165. newSize = CGSize(width: size.height * ratio, height: size.height)
  166. } else {
  167. newSize = CGSize(width: size.width, height: size.width / ratio)
  168. }
  169. ////图片绘制区域
  170. var rect = CGRect.zero
  171. rect.size.width = size.width
  172. rect.size.height = size.height
  173. rect.origin.x = (newSize.width - size.width) / 2.0
  174. rect.origin.y = (newSize.height - size.height) / 2.0
  175. // 绘制并获取最终图片
  176. UIGraphicsBeginImageContext(newSize)
  177. draw(in: rect)
  178. let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
  179. UIGraphicsEndImageContext()
  180. return scaledImage!
  181. }
  182. }