import Foundation import Vision /// Vision の feature print で「見た目の近さ」を測る。 /// /// `perform(on: URL)` は Vision 側が ImageIO でデコードするため、HEIC や RAW もそのまま渡せる。 enum FeaturePrinter { static func compute(for url: URL) async throws -> FeaturePrintObservation { var request = GenerateImageFeaturePrintRequest() // 縦横比が違う版(トリミング・リサイズ)でも比較できるよう、切り取らずに収める。 request.cropAndScaleAction = .scaleToFit return try await request.perform(on: url) } /// 距離は 0 が同一。比較できない組み合わせでは nil を返す。 static func distance( _ a: FeaturePrintObservation?, _ b: FeaturePrintObservation? ) -> Double? { guard let a, let b else { return nil } return try? a.distance(to: b) } }