PhotoClassifyPlugin.swift 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import Flutter
  2. import Photos
  3. import UIKit
  4. public class PhotoClassifyPlugin: NSObject, FlutterPlugin {
  5. var photoClassifier = PhotoClassifier()
  6. private static let METHOD_GET_PHOTO = "getPhoto"
  7. public static func register(with registrar: FlutterPluginRegistrar) {
  8. let channel = FlutterMethodChannel(name: "photo_classify", binaryMessenger: registrar.messenger())
  9. let instance = PhotoClassifyPlugin()
  10. registrar.addMethodCallDelegate(instance, channel: channel)
  11. }
  12. public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
  13. switch call.method {
  14. case PhotoClassifyPlugin.METHOD_GET_PHOTO:
  15. self.getPhoto(flutterResult: result)
  16. default:
  17. result(FlutterMethodNotImplemented)
  18. }
  19. }
  20. private func getPhoto(flutterResult: @escaping FlutterResult) {
  21. print("正在寻找照片中")
  22. let fetchOptions = PHFetchOptions()
  23. let allPhotos = PHAsset.fetchAssets(with: .image, options: fetchOptions)
  24. photoClassifier.classifyPhotos(
  25. assets: allPhotos,
  26. progressHandler: { [weak self] (stage, progress) in
  27. // DispatchQueue.main.async {
  28. // self?.updateProgress(stage: stage, progress: progress)
  29. // }
  30. },
  31. completion: { [weak self] result in
  32. guard let self = self else { return }
  33. var similarPhotos = result.similarPhotos
  34. // 创建数组存储最终结果
  35. var resultData: [[String: Any]] = []
  36. // 创建组来同步异步操作
  37. let group = DispatchGroup()
  38. // 遍历每组相似照片
  39. for photoGroup in similarPhotos {
  40. var groupData: [[String: Any]] = []
  41. // 处理组内每张照片
  42. for asset in photoGroup {
  43. group.enter()
  44. let options = PHImageRequestOptions()
  45. options.deliveryMode = .highQualityFormat
  46. options.isSynchronous = false
  47. PHImageManager.default().requestImage(
  48. for: asset,
  49. targetSize: CGSize(width: 800, height: 800), // 可调整尺寸
  50. contentMode: .aspectFit,
  51. options: options
  52. ) { image, info in
  53. defer { group.leave() }
  54. if let image = image,
  55. let imageData = image.jpegData(compressionQuality: 0.8) {
  56. // 创建照片信息字典
  57. let photoInfo: [String: Any] = [
  58. "data": FlutterStandardTypedData(bytes: imageData),
  59. "id": asset.localIdentifier,
  60. "width": image.size.width,
  61. "height": image.size.height,
  62. "creationDate": asset.creationDate?.timeIntervalSince1970 ?? 0
  63. ]
  64. DispatchQueue.main.async {
  65. groupData.append(photoInfo)
  66. }
  67. }
  68. }
  69. }
  70. // 等待当前组的所有照片处理完成
  71. group.wait()
  72. // 只有当组内有照片时才添加到结果中
  73. if !groupData.isEmpty {
  74. resultData.append(["group": groupData])
  75. }
  76. }
  77. // 在主线程返回结果
  78. DispatchQueue.main.async {
  79. flutterResult(resultData)
  80. }
  81. }
  82. )
  83. }
  84. }