[UIKit] UIView를 이미지로 캡쳐하기, UIImage를 파일로 만들기

UIView를 UIImage로 캡쳐하는 방법

NSView를 이미지로 캡쳐하는 방법에는 여러가지가 있는데, 캡쳐한 이미지를 파일로 저장하기 간편하게 쓰는 방법은 NSBitmapImageRep 클래스를 사용해서 현재 포커스된 뷰의 영역을 바로 캡쳐하는 것이다. (그 외에 PDF데이터를 바로 추출하거나, 뷰의 CALayer를 NSImage 상에서 렌더하는 방법등 여러 가지 방법이 있을 수 있다.)

코코아 터치에서는 NSBitmapImageRep 와 같은 클래스가 없다. 대신에 비트맵 이미지를 그래픽 컨텍스트에서 얻을 수 있다는 점을 이용하여 다음과 같은 방법을 쓸 수 있다.

-(UIImage*)captureView:(UIView *)theView
{
    UIGraphicsBeginImageContextWithOptions(theView.bounds.size,
            theView.isOpaque, 1.0);
    ;
    UIImage *resultImage =
        UIGraphicsGetImageFromCurrentImageContext();
    return UIImage;
}

그럼 UIKit에서 이미지를 파일로 저장하려면 어떻게 해야할까? 코코아에서는 NSBitmapImageRep이 그래픽 포맷에 대응하는 데이터를 제공했는데, UIKit에서는 이 클래스를 사용할 수 없다고 했다.

UIKit은 이를 위해 다른 함수를 제공하고 있다. UIImageJPEGRepresentation()UIImagePNGRepresentation()이 그것이다. 즉 모바일 기기에서 통용할 수 있는 그래픽 포맷은 사실상 PNG, JPEG 이므로 이 둘을 생성하는 함수를 아예 프레임워크가 지원하고 있다.

이들 함수는 각각 다음과 같이 선언되어 있으며, 이 함수를 통해 얻은 데이터를 디스크에 기록하면 바로 JPEG, PNG 파일을 얻을 수 있다. 참고로 compressionQuality는 0.0~1.0으로 1.0이 가장 좋은 화질을 의미한다.

NSData * UIImagePNGRepresentation ( UIImage *image);
NSData * UIImageJPEGRepresentation (
        UIImage *image,
        CGFloat compressionQuality );

물론 이미지를 바로 카메라롤에 저장하는 것과 이미지를 파일로 만드는 것은 좀 다른 이야기이긴하다.

참고 : NSView를 이미지로 만들기

[iOS] 코어그래픽에 손대기

코어그래픽은 뷰에 그림을 그리는 기술이다. 하지만 C로 짜여진 API에 온갖 혼란스러운 함수명하며, 컨텍스트와 같은 어려운 개념들이 들어가면서 나와 같은 초보자에게는 마치 ‘넘을 수 없는’ 장벽과 같이 느껴진다. 하지만 많은, 정말 많은 튜토리얼들이 코어그래픽을 사용해서 그림을 그리는 이유는 명확하다. 바로 “아주 빠르기” 때문이다. 코어 그래픽은 그래픽 메모리의 버퍼를 직접 다루므로 아주 빠르다. (다만 일부 기기에서는 느리기도 하더라 ㅠㅠ) 오늘은 “시작하는 마음가짐”으로 코어 그래픽에 대해 잠깐 살펴보도록 하자.

코어그래픽을 사용하는데는 ‘컨텍스트’라는 개념을 이해해야 하는데, 이는 뒤에서 설명하기로 하고 잠시동안 ‘컨텍스트’는 그림을 그리는 도화지, 혹은 포토샵에서의 레이어와 같다고 간주하자.
[iOS] 코어그래픽에 손대기 더보기