UIImage+JChat.swift 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. //
  2. // UIImage+JChat.swift
  3. // JChat
  4. //
  5. // Created by deng on 2017/6/20.
  6. // Copyright © 2017年 HXHG. All rights reserved.
  7. //
  8. import UIKit
  9. extension UIImage {
  10. func fixOrientation() -> UIImage {
  11. var image = self
  12. if self.imageOrientation == .up {
  13. return image
  14. }
  15. var transform = CGAffineTransform.identity
  16. switch self.imageOrientation {
  17. case .down, .downMirrored:
  18. transform = transform.translatedBy(x: image.size.width, y: image.size.height)
  19. transform = transform.rotated(by: .pi / 2)
  20. case .left, .leftMirrored:
  21. transform = transform.translatedBy(x: image.size.width, y: 0)
  22. transform = transform.rotated(by: .pi / 2)
  23. case .right, .rightMirrored :
  24. transform = transform.translatedBy(x: 0, y: image.size.height)
  25. transform = transform.rotated(by: -.pi / 2)
  26. default:
  27. break
  28. }
  29. switch self.imageOrientation {
  30. case .upMirrored, .downMirrored:
  31. transform = transform.translatedBy(x: image.size.width,y: 0)
  32. transform = transform.scaledBy(x: -1, y: 1)
  33. case .rightMirrored, .leftMirrored:
  34. transform = transform.translatedBy(x: image.size.height,y: 0)
  35. transform = transform.scaledBy(x: -1, y: 1)
  36. default:
  37. break
  38. }
  39. let ctx = CGContext(data: nil , width: Int(image.size.width), height: Int(image.size.height), bitsPerComponent: image.cgImage!.bitsPerComponent, bytesPerRow: 0, space: image.cgImage!.colorSpace!, bitmapInfo: image.cgImage!.bitmapInfo.rawValue)
  40. ctx!.concatenate(transform)
  41. switch image.imageOrientation {
  42. case .left, .leftMirrored, .right, .rightMirrored:
  43. ctx?.draw(image.cgImage!, in: CGRect(x: 0, y: 0, width: image.size.height, height: image.size.width))
  44. default:
  45. ctx?.draw(image.cgImage!, in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))
  46. }
  47. let cgImage = ctx!.makeImage()
  48. image = UIImage(cgImage: cgImage!)
  49. return image
  50. }
  51. static func createImage(color: UIColor, size: CGSize) -> UIImage? {
  52. var rect = CGRect(origin: CGPoint.zero, size: size)
  53. UIGraphicsBeginImageContext(size)
  54. defer {
  55. UIGraphicsEndImageContext()
  56. }
  57. let context = UIGraphicsGetCurrentContext()
  58. context?.setFillColor(color.cgColor)
  59. context?.fill(rect)
  60. let image = UIGraphicsGetImageFromCurrentImageContext()
  61. return image
  62. }
  63. static func getMyAvator() -> UIImage? {
  64. if let data = UserDefaults.standard.object(forKey: kLastUserAvator) as? Data {
  65. let avatorData = NSKeyedUnarchiver.unarchiveObject(with: data) as! Data
  66. return UIImage(data: avatorData)
  67. }
  68. return nil
  69. }
  70. func resizeImage(_ newSize: CGSize) -> UIImage {
  71. UIGraphicsBeginImageContextWithOptions(newSize, false, UIScreen.main.scale)
  72. self.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
  73. let newImage = UIGraphicsGetImageFromCurrentImageContext()
  74. UIGraphicsEndImageContext()
  75. return newImage!
  76. }
  77. // iOS 9 以后,ImageView.image 设置圆角并不会触发离屏渲染了
  78. // 可以异步绘制,再主线刷新
  79. func imageCornerRadius(_ radius: CGFloat) -> UIImage? {
  80. let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
  81. UIGraphicsBeginImageContextWithOptions(self.size, false, UIScreen.main.scale);
  82. guard let ctx = UIGraphicsGetCurrentContext() else {
  83. return nil
  84. }
  85. ctx.addPath(UIBezierPath(roundedRect: rect, cornerRadius: radius).cgPath)
  86. ctx.clip()
  87. draw(in: rect)
  88. let image = UIGraphicsGetImageFromCurrentImageContext()
  89. UIGraphicsEndImageContext()
  90. return image
  91. }
  92. }