66//
77
88import Foundation
9- import CoreML
109import Vision
11- import UniformTypeIdentifiers
1210import ComposableArchitecture
1311import CoreImage
14- import os
1512
1613public final class DefaultImageTransformRepository : ImageTransformRepository {
1714
@@ -28,17 +25,17 @@ public final class DefaultImageTransformRepository: ImageTransformRepository {
2825 }
2926 }
3027
31- public func transform( data inputData : Data ) async throws -> Data {
28+ public func transform( image inputImage : CGImage ) async throws -> CGImage {
3229 let visionModel = try await modelTask. value
3330
3431 return try await Task ( priority: . userInitiated) {
3532 let request = VNCoreMLRequest ( model: visionModel)
3633 request. imageCropAndScaleOption = . scaleFit
3734
38- let handler = VNImageRequestHandler ( data : inputData )
35+ let handler = VNImageRequestHandler ( cgImage : inputImage )
3936 try handler. perform ( [ request] )
4037
41- return try self . extractData ( from: request. results)
38+ return try self . extractCGImage ( from: request. results)
4239 } . value
4340 }
4441}
@@ -47,48 +44,18 @@ public final class DefaultImageTransformRepository: ImageTransformRepository {
4744// MARK: - DefaultImageTransformRepository Private Helpers
4845
4946private extension DefaultImageTransformRepository {
50-
51- /// Vision 결과물을 추출하여 최종 PNG Data로 변환하는 로직
52- func extractData( from results: [ VNObservation ] ? ) throws -> Data {
53- // Vision 결과물(CVPixelBuffer)
47+ func extractCGImage( from results: [ VNObservation ] ? ) throws -> CGImage {
5448 guard let observations = results as? [ VNPixelBufferObservation ] ,
5549 let pixelBuffer = observations. first? . pixelBuffer else {
5650 throw ImageTransformRepositoryError . renderingFailed
5751 }
5852
59- // 픽셀 데이터를 이미지(CIImage -> CGImage)로 렌더링
6053 let ciImage = CIImage ( cvPixelBuffer: pixelBuffer)
6154 guard let outputCGImage = self . ciContext. createCGImage ( ciImage, from: ciImage. extent) else {
6255 throw ImageTransformRepositoryError . renderingFailed
6356 }
6457
65- // 렌더링된 이미지를 PNG 형식의 Data로 압축
66- return try compressToPNG ( cgImage: outputCGImage)
67- }
68-
69- /// CGImage를 PNG Data로 압축하는 메서드 (너무 어렵다...)
70- /// UIImage(cgImage:).pngData() 이거 쓰면 딸깍이긴 하지만 Data 레이어에 UIKit 의존성이 생겨버림..
71- func compressToPNG( cgImage: CGImage ) throws -> Data {
72- guard let cfMutableData = CFDataCreateMutable ( kCFAllocatorDefault, 0 ) else {
73- throw ImageTransformRepositoryError . destinationCreationFailed
74- }
75-
76- guard let destination = CGImageDestinationCreateWithData (
77- cfMutableData,
78- UTType . png. identifier as CFString ,
79- 1 ,
80- nil
81- ) else {
82- throw ImageTransformRepositoryError . destinationCreationFailed
83- }
84-
85- CGImageDestinationAddImage ( destination, cgImage, nil )
86-
87- if CGImageDestinationFinalize ( destination) {
88- return cfMutableData as Data
89- } else {
90- throw ImageTransformRepositoryError . dataCompressionFailed
91- }
58+ return outputCGImage
9259 }
9360}
9461
0 commit comments