Extension+UIImage.swift 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. //
  2. // Extension+UIImage.swift
  3. // RainbowPlanet
  4. //
  5. // Created by 南鑫林 on 2018/9/27.
  6. // Copyright © 2018 南鑫林. All rights reserved.
  7. //
  8. import UIKit
  9. extension UIImage {
  10. /// 添加着色方法
  11. ///
  12. /// - Parameters:
  13. /// - color: 颜色
  14. /// - blendMode: 实现图片颜色的修改
  15. /// - Returns: 图片
  16. func tint(color: UIColor, blendMode: CGBlendMode) -> UIImage {
  17. let drawRect = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height)
  18. UIGraphicsBeginImageContextWithOptions(size, false, scale)
  19. //let context = UIGraphicsGetCurrentContext()
  20. //CGContextClipToMask(context, drawRect, CGImage)
  21. color.setFill()
  22. UIRectFill(drawRect)
  23. draw(in: drawRect, blendMode: blendMode, alpha: 1.0)
  24. let tintedImage = UIGraphicsGetImageFromCurrentImageContext()
  25. UIGraphicsEndImageContext()
  26. return tintedImage!
  27. }
  28. /// 水印位置枚举
  29. ///
  30. /// - TopLeft: 左上
  31. /// - TopRight: 右上
  32. /// - BottomLeft: 左下
  33. /// - BottomRight: 右下
  34. enum WaterMarkCorner{
  35. case TopLeft
  36. case TopRight
  37. case BottomLeft
  38. case BottomRight
  39. }
  40. /// 添加水印方法
  41. ///
  42. /// - Parameters:
  43. /// - waterMarkText: 水印字体
  44. /// - corner: 内容
  45. /// - margin: 间距
  46. /// - waterMarkTextColor: 水印字体颜色
  47. /// - waterMarkTextFont: 字体大小
  48. /// - backgroundColor: 背景色
  49. /// - Returns: 图片
  50. func waterMarkedImage(waterMarkText:String,
  51. corner:WaterMarkCorner = .BottomRight,
  52. margin:CGPoint = CGPoint(x: 20, y: 20),
  53. waterMarkTextColor:UIColor = UIColor.white,
  54. waterMarkTextFont:UIFont = UIFont.systemFont(ofSize: 20),
  55. backgroundColor:UIColor = UIColor.clear) -> UIImage {
  56. let textAttributes = [NSAttributedString.Key.foregroundColor:waterMarkTextColor,
  57. NSAttributedString.Key.font:waterMarkTextFont,
  58. NSAttributedString.Key.backgroundColor:backgroundColor]
  59. let textSize = NSString(string: waterMarkText).size(withAttributes: textAttributes)
  60. var textFrame = CGRect(x: 0, y: 0, width: textSize.width, height: textSize.height)
  61. let imageSize = self.size
  62. switch corner{
  63. case .TopLeft:
  64. textFrame.origin = margin
  65. case .TopRight:
  66. textFrame.origin = CGPoint(x: imageSize.width - textSize.width - margin.x, y: margin.y)
  67. case .BottomLeft:
  68. textFrame.origin = CGPoint(x: margin.x, y: imageSize.height - textSize.height - margin.y)
  69. case .BottomRight:
  70. textFrame.origin = CGPoint(x: imageSize.width - textSize.width - margin.x,
  71. y: imageSize.height - textSize.height - margin.y)
  72. }
  73. // 开始给图片添加文字水印
  74. UIGraphicsBeginImageContext(imageSize)
  75. self.draw(in: CGRect(x: 0, y: 0, width: imageSize.width, height: imageSize.height))
  76. NSString(string: waterMarkText).draw(in: textFrame, withAttributes: textAttributes)
  77. let waterMarkedImage = UIGraphicsGetImageFromCurrentImageContext()
  78. UIGraphicsEndImageContext()
  79. return waterMarkedImage!
  80. }
  81. /// 添加图片水印方法
  82. ///
  83. /// - Parameters:
  84. /// - waterMarkImage: 图片
  85. /// - corner: 位置
  86. /// - margin: 间距
  87. /// - alpha: 透明度
  88. /// - Returns: 图片
  89. func waterMarkedImage(waterMarkImage:UIImage,
  90. corner:WaterMarkCorner = .BottomRight,
  91. margin:CGPoint = CGPoint(x: 20, y: 20),
  92. alpha:CGFloat = 1) -> UIImage{
  93. var markFrame = CGRect(x: 0, y: 0, width: waterMarkImage.size.width, height: waterMarkImage.size.height)
  94. let imageSize = self.size
  95. switch corner{
  96. case .TopLeft:
  97. markFrame.origin = margin
  98. case .TopRight:
  99. markFrame.origin = CGPoint(x: imageSize.width - waterMarkImage.size.width - margin.x,
  100. y: margin.y)
  101. case .BottomLeft:
  102. markFrame.origin = CGPoint(x: margin.x,
  103. y: imageSize.height - waterMarkImage.size.height - margin.y)
  104. case .BottomRight:
  105. markFrame.origin = CGPoint(x: imageSize.width - waterMarkImage.size.width - margin.x,
  106. y: imageSize.height - waterMarkImage.size.height - margin.y)
  107. }
  108. // 开始给图片添加图片
  109. UIGraphicsBeginImageContext(imageSize)
  110. self.draw(in: CGRect(x: 0, y: 0, width: imageSize.width, height: imageSize.height))
  111. waterMarkImage.draw(in: markFrame, blendMode: .normal, alpha: alpha)
  112. let waterMarkedImage = UIGraphicsGetImageFromCurrentImageContext()
  113. UIGraphicsEndImageContext()
  114. return waterMarkedImage!
  115. }
  116. /// 棕褐色复古滤镜(老照片效果)
  117. ///
  118. /// - Returns: 图片
  119. func sepiaTone() -> UIImage? {
  120. let imageData = self.pngData()
  121. let inputImage = CoreImage.CIImage(data: imageData!)
  122. let context = CIContext(options:nil)
  123. let filter = CIFilter(name:"CISepiaTone")
  124. filter!.setValue(inputImage, forKey: kCIInputImageKey)
  125. filter!.setValue(0.8, forKey: "inputIntensity")
  126. if let outputImage = filter!.outputImage {
  127. let outImage = context.createCGImage(outputImage, from: outputImage.extent)
  128. return UIImage(cgImage: outImage!)
  129. }
  130. return nil
  131. }
  132. //黑白效果滤镜
  133. func noir() -> UIImage?
  134. {
  135. let imageData = self.pngData()
  136. let inputImage = CoreImage.CIImage(data: imageData!)
  137. let context = CIContext(options:nil)
  138. let filter = CIFilter(name:"CIPhotoEffectNoir")
  139. filter!.setValue(inputImage, forKey: kCIInputImageKey)
  140. if let outputImage = filter!.outputImage {
  141. let outImage = context.createCGImage(outputImage, from: outputImage.extent)
  142. return UIImage(cgImage: outImage!)
  143. }
  144. return nil
  145. }
  146. /// 将颜色转换为图片
  147. ///
  148. /// - Parameter color: UIColor
  149. /// - Returns: UIImage
  150. class func imageWithColor(color:UIColor)->UIImage{
  151. let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
  152. UIGraphicsBeginImageContext(rect.size)
  153. let context = UIGraphicsGetCurrentContext()
  154. context!.setFillColor(color.cgColor)
  155. context!.fill(rect)
  156. let image = UIGraphicsGetImageFromCurrentImageContext()
  157. UIGraphicsEndImageContext()
  158. return image!
  159. }
  160. class func image(with color: UIColor?, size: CGSize, isRoundedCorner isRounded: Bool) -> UIImage? {
  161. let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
  162. UIGraphicsBeginImageContextWithOptions(size, _: false, _: UIScreen.main.scale)
  163. let context = UIGraphicsGetCurrentContext()
  164. context?.setFillColor(color!.cgColor)
  165. context?.fill(rect)
  166. var image = UIGraphicsGetImageFromCurrentImageContext()
  167. UIGraphicsEndImageContext()
  168. if isRounded {
  169. let radius: CGFloat = size.width/2
  170. let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
  171. UIGraphicsBeginImageContextWithOptions(size, _: false, _: UIScreen.main.scale)
  172. let context = UIGraphicsGetCurrentContext()
  173. let path = UIBezierPath(roundedRect: rect, byRoundingCorners: .allCorners, cornerRadii: CGSize(width: radius, height: radius))
  174. context?.addPath(path.cgPath)
  175. context?.clip()
  176. image?.draw(in: rect)
  177. context?.drawPath(using: .fillStroke)
  178. image = UIGraphicsGetImageFromCurrentImageContext()
  179. UIGraphicsEndImageContext()
  180. }
  181. return image
  182. }
  183. class func getImageSize(_ url: String?) -> CGSize {
  184. guard let urlStr = url else {
  185. return CGSize.zero
  186. }
  187. let tempUrl = URL(string: urlStr)
  188. let imageSourceRef = CGImageSourceCreateWithURL(tempUrl! as CFURL, nil)
  189. var width: CGFloat = 0
  190. var height: CGFloat = 0
  191. if let imageSRef = imageSourceRef {
  192. let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSRef, 0, nil)
  193. if let imageP = imageProperties {
  194. let imageDict = imageP as Dictionary
  195. width = imageDict[kCGImagePropertyPixelWidth] as! CGFloat
  196. height = imageDict[kCGImagePropertyPixelHeight] as! CGFloat
  197. }
  198. }
  199. return CGSize(width: width, height: height)
  200. }
  201. class func imageUrl(_ url: String?) -> UIImage {
  202. let url = URL(string: url ?? "")!
  203. let data = try? Data(contentsOf: url)
  204. let image : UIImage?
  205. if data != nil {
  206. image = UIImage(data: data!, scale: 0.5)
  207. }else {
  208. image = kImage(name: "LaunchScreenLogo")
  209. }
  210. return image!
  211. }
  212. }
  213. extension UIImage {
  214. class func rotate(aImage:UIImage) -> UIImage {
  215. // 向上 直接返回
  216. if aImage.imageOrientation == .up {
  217. return aImage
  218. }
  219. // 向下M_PI 向左M_PI_2 向右-M_PI_2
  220. var transform: CGAffineTransform = CGAffineTransform.identity
  221. switch aImage.imageOrientation {
  222. case .down, .downMirrored:
  223. transform = transform.translatedBy(x: aImage.size.width, y: aImage.size.height)
  224. transform = transform.rotated(by: CGFloat(Double.pi))
  225. case .left, .leftMirrored:
  226. transform = transform.translatedBy(x: aImage.size.width, y: 0)
  227. transform = transform.rotated(by: CGFloat(Double.pi / 2))
  228. case .right, .rightMirrored:
  229. transform = transform.translatedBy(x: 0, y: aImage.size.height)
  230. transform = transform.rotated(by: CGFloat(-Double.pi / 2))
  231. default:
  232. break
  233. }
  234. switch aImage.imageOrientation {
  235. case .upMirrored, .downMirrored:
  236. transform = transform.translatedBy(x: aImage.size.width, y: 0)
  237. transform = transform.scaledBy(x: -1, y: 1)
  238. case .leftMirrored, .rightMirrored:
  239. transform = transform.translatedBy(x: aImage.size.height, y: 0)
  240. transform = transform.scaledBy(x: -1, y: 1)
  241. default:
  242. break
  243. }
  244. //渲染
  245. let ctx: CGContext = CGContext(data: nil, width: Int(aImage.size.width), height: Int(aImage.size.height), bitsPerComponent: aImage.cgImage!.bitsPerComponent, bytesPerRow: 0, space: aImage.cgImage!.colorSpace!, bitmapInfo: aImage.cgImage!.bitmapInfo.rawValue)!
  246. ctx.concatenate(transform)
  247. switch aImage.imageOrientation {
  248. case .left, .leftMirrored, .right, .rightMirrored:
  249. ctx.draw(aImage.cgImage!, in: CGRect(x: 0, y: 0, width: aImage.size.height, height: aImage.size.width))
  250. default:
  251. ctx.draw(aImage.cgImage!, in: CGRect(x: 0, y: 0, width: aImage.size.width, height: aImage.size.height))
  252. }
  253. // 新的图片
  254. let cgimg: CGImage = ctx.makeImage()!
  255. let img: UIImage = UIImage(cgImage: cgimg)
  256. return img
  257. }
  258. }