// // PhotosImageClassifier+Process.swift // Demo // // Created by Groot on 2025/4/27. // import Foundation import Vision import Photos // MARK: - 图像处理 extension PhotosImageClassifier { /// 处理单个图像,提取分类特征 /// - Parameter item: 图像项目 func processImage(with types: [PhotoImageClassifyType], item: inout ImageItem) { var imageInfo = ImageItem.ClassifyInfo() // 检测屏幕截图 if types.contains(.screenshot) { imageInfo.isScreenshot = item.asset.mediaSubtypes.contains(.photoScreenshot) } // 检测模糊图像 if types.contains(.blurry) { imageInfo.isBlurry = Self.detectBlurryImages(item: item) } guard types.contains(.similar) || types.contains(.people), let cgImage = item.thumbnailImage?.cgImage else { item.classfiyInfo = imageInfo return } // Vision 请求处理 let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:]) // 特征向量提取请求 let featureDetectionRequest = VNGenerateImageFeaturePrintRequest() // 人脸检测请求 let faceDetectionRequest = VNDetectFaceRectanglesRequest() faceDetectionRequest.revision = VNDetectFaceRectanglesRequestRevision3 let requests = [ types.contains(.similar) ? featureDetectionRequest : nil, types.contains(.people) ? faceDetectionRequest : nil ].compactMap { $0 } guard !requests.isEmpty else { item.classfiyInfo = imageInfo return } try? requestHandler.perform(requests) // 获取相似特征 if types.contains(.similar), let featureDetectResult = featureDetectionRequest.results?.first as? VNFeaturePrintObservation { imageInfo.similarFeature = featureDetectResult } // 检测人脸 if types.contains(.people), let faceDetectResult = faceDetectionRequest.results, !faceDetectResult.isEmpty { imageInfo.containsPeople = true } item.classfiyInfo = imageInfo } }