diff --git a/Sources/Photochk/Core/FeaturePrinter.swift b/Sources/Photochk/Core/FeaturePrinter.swift new file mode 100644 index 0000000..66963cb --- /dev/null +++ b/Sources/Photochk/Core/FeaturePrinter.swift @@ -0,0 +1,23 @@ +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) + } +}