달력

9

« 2019/9 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  •  
  •  
  •  
  •  
  •  

푸딩.투를 개발할때 결국 해결 못했던 일인데 지난 주에 해결 방법을 알아낸 기념으로 첫 블로그 글로 정했다.

일단 이게 무슨 말인고하니.


사진 앱에 보면 언젠가부터(iOS 5였던걸로 기억) 편집 기능이 들어갔다.



바로 요것.. 


문제는 이렇게 사진 편집을 하고 저장을 하면 원본과 편집본이 동시에 보관이 된다는 것이다.


여기서 잠깐.. Asset library를 이용해서 사진을 가져오는 메쏘드는 크게 두가지다.

하나는 화면 표시용으로 화면 사이즈에 맞게 읽어오는 fullScreenImage 메쏘드와 다른 하나는 원본을 가져오는 fullResolutionImage 이렇게 두가지이다. 이 중에서 fullResolutionImage 메쏘드로 사진을 가져올 때, 편집된 편집본이 아닌 원본을 가져오게 되면서 문제는 발생을 한다. 사진 앱이나 스크린 사이즈로 읽어오면 편집된 사진이 잘 넘어오는데 원본 사이즈로 읽어오면 원본 이미지가 넘어오니 딱 봐도 이상하지.


그런데 사실은 원본 이미지와 더불어 편집된 정보가 메타데이터를 통해 전달이 되었던 것이었다. 이 사실을 최근에 알았음. -_- 그러나 아직 문제가 해결된건 아니고. 메타데이터에 넘어오는 데이터 형식이 xmp 포맷으로 xml 비슷하게 생겼고 이걸 파싱할 필요가 있다. 파서를 굳이 구하겠다면 구할 수도 있겠지만 다행히 iOS 6부터는 이 xmp 데이터로부터 원본을 가져올 수 있는 방법이 Core image의 필터 중 하나로 제공이 된다. 다시한번 iOS 6부터만 가능하다. 그 이전버전에서는 파서를 구해야 한다.


자.. 소스 나간다.


        ALAssetRepresentation *rep = [myasset defaultRepresentation];
        NSString *strXMP = rep.metadata[@"AdjustmentXMP"];
        if (strXMP == nil || [strXMP isKindOfClass:[NSNull class]])
        {
            ALAssetRepresentation	*rep = [myasset defaultRepresentation];
            
            CGImageRef iref = [rep fullResolutionImage];//[rep fullResolutionImage];
            if (iref)
                iImage = [UIImage imageWithCGImage:iref scale:1.0 orientation:(UIImageOrientation)rep.orientation];
            else
                iImage = nil;
        }
        else
        {
            NSData *dXMP = [strXMP dataUsingEncoding:NSUTF8StringEncoding];
            
            CIImage *image = [CIImage imageWithCGImage:rep.fullResolutionImage];
            
            NSError *error = nil;
            NSArray *filterArray = [CIFilter filterArrayFromSerializedXMP:dXMP
                                                         inputImageExtent:image.extent
                                                                    error:&error];
            if (error) {
                NSLog(@"Error during CIFilter creation: %@", [error localizedDescription]);
            }
            
            for (CIFilter *filter in filterArray) {
                [filter setValue:image forKey:kCIInputImageKey];
                image = [filter outputImage];
            }
            
            iImage = [UIImage imageWithCIImage:image scale:1.0 orientation:(UIImageOrientation)rep.orientation];
        }


메타 데이터 중에 AdjustmentXMP 필드로 데이터가 넘어오고 데이터가 있는 경우에는 Core image를 거쳐서 UIImage 형태로 얻어올 수 있게 된다.


역시 stackoverflow에서 찾은 토픽인데 다시 찾으려니 안찾아지네.. -_-

대신 풀 소스 첨부함..


사실 이런 케이스가 흔하지 않은 경우다보니 관심있는 사람도 그닥 없으리라 생각되지만.. 그래도 이런거 찾아내는 것도 하나의 재미니깐.. 그런걸 위주로 블로깅을 앞으로 할까 한다.. 


참고로 기본적으로 해야할 예외처리들도 많이 빠져있다. 딱 기능 위주로 만든 소스임;;


AssetCropped.zip


아.. 참고로.. Crop하고 Auto enhanced 기능 정도는 적용된 편집본을 얻어올 수 있는데 그 이상은 안해봤다.. -_- 사실 stackoverflow에 올라왔던 글도 글을 올린이가 자기가 해보니 요 두가지는 잘 됐는데 다른게 잘 안되더라라고 질문으로 올렸던 글이었다.. -_- 이정도라도 얻어오면 됐지 뭘.. 훗.. -_-

Posted by 도노보노