BFUIImage+Ext.swift 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  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. // MARK: - 刷新控件类型
  10. /// 刷新控件类型
  11. public enum moveDirection {
  12. case moveDirectionNormal
  13. case moveDirectionUp
  14. case moveDirectionDown
  15. case moveDirectionRight
  16. case moveDirectionLeft
  17. }
  18. public extension UIImage {
  19. // 从BFframwork bundle 中取图片
  20. func BF_Image(named: String) -> UIImage {
  21. let image: UIImage = UIImage(named: named, in: Bundle().BF_mainbundle(), compatibleWith: nil) ?? UIImage()
  22. return image
  23. }
  24. class func moduleImage(named: String, moduleName: String,isAssets:Bool = true) -> UIImage? {
  25. let image: UIImage? = UIImage(named: named, in: Bundle.current(moduleName: moduleName,isAssets: isAssets), compatibleWith: nil)
  26. return image
  27. }
  28. func cropImage(ratio: CGFloat) -> UIImage {
  29. // 计算最终尺寸
  30. let newSize: CGSize = CGSize(width: size.width, height: size.width * ratio)
  31. // 图片绘制区域
  32. var rect = CGRect.zero
  33. rect.size.width = size.width
  34. rect.size.height = size.height
  35. rect.origin.x = (newSize.width - size.width) / 2.0
  36. rect.origin.y = (newSize.height - size.height) / 2.0
  37. UIGraphicsBeginImageContext(newSize)
  38. draw(in: rect)
  39. let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
  40. UIGraphicsEndImageContext()
  41. return scaledImage!
  42. }
  43. func cropImage(newSize: CGSize) -> UIImage {
  44. //// 图片绘制区域
  45. var rect = CGRect.zero
  46. rect.size.width = newSize.width
  47. rect.size.height = newSize.width * (size.height / size.width)
  48. // 绘制并获取最终图片
  49. UIGraphicsBeginImageContext(newSize)
  50. draw(in: rect)
  51. let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
  52. UIGraphicsEndImageContext()
  53. return scaledImage!
  54. }
  55. func imageWithImage(scaledToSize newSize: CGSize) -> UIImage {
  56. UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
  57. draw(in: CGRect(origin: CGPoint.zero, size: newSize))
  58. let newImage = UIGraphicsGetImageFromCurrentImageContext() ?? self
  59. UIGraphicsEndImageContext()
  60. return newImage
  61. }
  62. /// 旋转角度
  63. /// - Parameter image: <#image description#>
  64. /// - Returns: <#description#>
  65. func rotateImage(rotate: Int, originWidth: CGFloat, originHeight: CGFloat) -> UIImage {
  66. let rotate: CGFloat = CGFloat(3 * Double.pi / 2)
  67. let rect = CGRect(x: 0, y: 0, width: originWidth, height: originHeight)
  68. let translateX: CGFloat = -rect.size.height
  69. let translateY: CGFloat = 0
  70. let scaleY = rect.size.width / rect.size.height
  71. let scaleX = rect.size.height / rect.size.width
  72. UIGraphicsBeginImageContext(rect.size)
  73. let context = UIGraphicsGetCurrentContext()
  74. // context!.translateBy(x: 0.0, y: rect.size.height)
  75. // context!.scaleBy(x: 1.0, y: -1.0)
  76. context!.rotate(by: rotate)
  77. context!.translateBy(x: translateX, y: translateY)
  78. context!.scaleBy(x: scaleX, y: scaleY)
  79. draw(in: CGRect(x: 0, y: 0, width: rect.size.width, height: rect.size.height))
  80. return UIGraphicsGetImageFromCurrentImageContext()!
  81. }
  82. /// 生成三角图
  83. /// - Parameters:
  84. /// - size: <#size description#>
  85. /// - tintColor: <#tintColor description#>
  86. /// - convert:是否倒置
  87. /// - Returns: <#description#>
  88. class func triangleImage(size: CGSize, tintColor: UIColor, direction: moveDirection = .moveDirectionDown) -> UIImage {
  89. var startPoint: CGPoint = CGPoint.zero
  90. var middlePoint: CGPoint = CGPoint.zero
  91. var endPoint: CGPoint = CGPoint.zero
  92. switch direction {
  93. case .moveDirectionLeft:
  94. startPoint = CGPoint(x: size.width, y: 0)
  95. middlePoint = CGPoint(x: 0, y: size.height / 2.0)
  96. endPoint = CGPoint(x: size.width, y: size.height)
  97. case .moveDirectionRight:
  98. startPoint = CGPoint(x: 0, y: 0)
  99. middlePoint = CGPoint(x: size.width, y: size.height / 2.0)
  100. endPoint = CGPoint(x: 0, y: size.height)
  101. case .moveDirectionUp:
  102. startPoint = CGPoint(x: 0, y: size.height)
  103. middlePoint = CGPoint(x: size.width / 2.0, y: 0)
  104. endPoint = CGPoint(x: size.width, y: size.height)
  105. default:
  106. startPoint = CGPoint(x: 0, y: 0)
  107. middlePoint = CGPoint(x: size.width / 2.0, y: size.height)
  108. endPoint = CGPoint(x: size.width, y: 0)
  109. }
  110. UIGraphicsBeginImageContextWithOptions(size, false, 0)
  111. let ctx = UIGraphicsGetCurrentContext()
  112. let path = UIBezierPath()
  113. path.move(to: startPoint)
  114. path.addLine(to: middlePoint)
  115. path.addLine(to: endPoint)
  116. path.close()
  117. ctx?.setFillColor(tintColor.cgColor)
  118. path.fill()
  119. let image = UIGraphicsGetImageFromCurrentImageContext()!
  120. UIGraphicsEndImageContext()
  121. return image
  122. }
  123. /// 按照最短边缩放 add by ak
  124. /// - Parameter maxLength: 边长最大值
  125. func nx_scaleWithMaxLength(maxLength: CGFloat) -> UIImage {
  126. if size.width > maxLength || size.height > maxLength {
  127. var maxWidth: CGFloat = maxLength
  128. var maxHeight: CGFloat = maxLength
  129. if size.width != size.height {
  130. if size.width > size.height {
  131. // 按照宽 来缩放
  132. let imageScale: CGFloat = maxLength / size.width
  133. maxHeight = size.height * imageScale
  134. } else if size.width < size.height {
  135. let imageScale: CGFloat = maxLength / size.height
  136. maxWidth = size.width * imageScale
  137. }
  138. }
  139. // 返回新的改变大小后的图片
  140. return nx_scaleToSize(size: CGSize(width: maxWidth, height: maxHeight))
  141. }
  142. return self
  143. }
  144. /// 缩放到指定大小 add by ak
  145. /// - Parameter size: 新的大小
  146. func nx_scaleToSize(size: CGSize) -> UIImage {
  147. var width: CGFloat = CGFloat(cgImage!.width)
  148. var height: CGFloat = CGFloat(cgImage!.height)
  149. let verticalRadio: CGFloat = size.height * 1.0 / height
  150. let horizontalRadio: CGFloat = size.width * 1.0 / width
  151. var radio: CGFloat = 1
  152. if verticalRadio > 1, horizontalRadio > 1 {
  153. radio = verticalRadio > horizontalRadio ? horizontalRadio : verticalRadio
  154. } else {
  155. radio = verticalRadio < horizontalRadio ? verticalRadio : horizontalRadio
  156. }
  157. width = width * radio
  158. height = height * radio
  159. let xPos: CGFloat = (size.width - width) / 2
  160. let yPos: CGFloat = (size.height - height) / 2
  161. // 创建一个bitmap的context
  162. // 并把它设置成为当前正在使用的context
  163. UIGraphicsBeginImageContext(size)
  164. // 绘制改变大小的图片
  165. var rect = CGRect.zero
  166. rect.size.width = width
  167. rect.size.height = height
  168. rect.origin.x = xPos
  169. rect.origin.y = yPos
  170. draw(in: rect)
  171. // 从当前context中创建一个改变大小后的图片
  172. let scaledImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
  173. // 使当前的context出堆栈
  174. UIGraphicsEndImageContext()
  175. // 返回新的改变大小后的图片
  176. return scaledImage
  177. }
  178. // 将图片裁剪成指定比例(多余部分自动删除)let image3 = image.crop(ratio: 1) /将图片转成 1:1 比例(正方形)
  179. func nxcrop(ratio: CGFloat) -> UIImage {
  180. // 计算最终尺寸
  181. var newSize: CGSize!
  182. if size.width / size.height > ratio {
  183. newSize = CGSize(width: size.height * ratio, height: size.height)
  184. } else {
  185. newSize = CGSize(width: size.width, height: size.width / ratio)
  186. }
  187. ////图片绘制区域
  188. var rect = CGRect.zero
  189. rect.size.width = size.width
  190. rect.size.height = size.height
  191. rect.origin.x = (newSize.width - size.width) / 2.0
  192. rect.origin.y = (newSize.height - size.height) / 2.0
  193. // 绘制并获取最终图片
  194. UIGraphicsBeginImageContext(newSize)
  195. draw(in: rect)
  196. let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
  197. UIGraphicsEndImageContext()
  198. return scaledImage!
  199. }
  200. /// 改变图片主题颜色
  201. /// - Parameters:
  202. /// - color: <#color description#>
  203. /// - blendMode: <#blendMode description#>
  204. /// - Returns: <#description#>
  205. func tintImage(color: UIColor, blendMode: CGBlendMode) -> UIImage? {
  206. let rect = CGRect(origin: CGPoint.zero, size: size)
  207. UIGraphicsBeginImageContextWithOptions(size, false, scale)
  208. color.setFill()
  209. UIRectFill(rect)
  210. draw(in: rect, blendMode: blendMode, alpha: 1.0)
  211. let tintedImage = UIGraphicsGetImageFromCurrentImageContext()
  212. UIGraphicsEndImageContext()
  213. return tintedImage
  214. }
  215. }