UIImage+Extension.swift 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. //
  2. // UIImage+Extension.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/11/16.
  6. //
  7. import Foundation
  8. import Photos
  9. enum LNImageCompressType {
  10. case none
  11. case avatar
  12. case photoWall
  13. var maxSize: CGSize {
  14. switch self {
  15. case .none: .zero
  16. case .avatar: .init(width: 600, height: 600)
  17. case .photoWall: .init(width: 750, height: 1334)
  18. }
  19. }
  20. }
  21. extension UIImage {
  22. func saveToLibrary(completion: ((Bool, Error?) -> Void)?) {
  23. // 步骤1:检查并请求相册权限
  24. PHPhotoLibrary.requestAuthorization { status in
  25. DispatchQueue.main.async { // 回调默认在子线程,切回主线程处理UI
  26. switch status {
  27. case .authorized, .limited: // 授权(含iOS 14+有限授权)
  28. // 步骤2:异步保存图片到相册
  29. PHPhotoLibrary.shared().performChanges({
  30. // 创建保存请求
  31. PHAssetChangeRequest.creationRequestForAsset(from: self)
  32. }) { success, error in
  33. DispatchQueue.main.async {
  34. completion?(success, error)
  35. }
  36. }
  37. case .denied, .restricted: // 权限拒绝/受限
  38. let error = NSError(domain: "AlbumError", code: -1, userInfo: [
  39. NSLocalizedDescriptionKey: "相册权限已拒绝,请前往设置开启"
  40. ])
  41. completion?(false, error)
  42. case .notDetermined: // 理论上不会走到这里(requestAuthorization已触发授权)
  43. completion?(false, NSError(domain: "AlbumError", code: -2, userInfo: [
  44. NSLocalizedDescriptionKey: "权限请求未完成"
  45. ]))
  46. @unknown default:
  47. completion?(false, NSError(domain: "AlbumError", code: -3, userInfo: [
  48. NSLocalizedDescriptionKey: "未知权限状态"
  49. ]))
  50. }
  51. }
  52. }
  53. }
  54. func compress(type: LNImageCompressType) -> UIImage? {
  55. let maxSize: CGSize = type.maxSize
  56. if maxSize == .zero {
  57. UIGraphicsBeginImageContext(CGSizeMake(size.width, size.height));
  58. draw(in: .init(origin: .zero, size: size))
  59. let convertToUpImage = UIGraphicsGetImageFromCurrentImageContext();
  60. UIGraphicsEndImageContext();
  61. return convertToUpImage
  62. }
  63. if size.width <= maxSize.width
  64. && size.height <= maxSize.height {
  65. return self
  66. }
  67. let widthRatio = maxSize.width / size.width
  68. let heightRatio = maxSize.height / size.height
  69. let scaleRatio = min(widthRatio, heightRatio)
  70. let newSize = CGSize(width: size.width * scaleRatio,
  71. height: size.height * scaleRatio)
  72. let renderer = UIGraphicsImageRenderer(size: newSize)
  73. let resizedImage = renderer.image { _ in
  74. draw(in: CGRect(origin: .zero, size: newSize))
  75. }
  76. return resizedImage
  77. }
  78. }