[Cocoa] NSImage를 파일로 저장하기

NSImage를 파일로 저장하기

이미지를 파일로 저장하기 위해서는 ‘표현형식'(representation)에 대해 알아야 한다. 즉 이미지 자체는 일련의 픽셀을 모아둔 데이터인데, 우리가 흔히 알고 있는 JPG, PNG 등의 파일 포맷은 이 이미지를 각각 정해진 방식으로 ‘정리’하여 파일에 저장하기 때문이다. 표현형식은 이런 파일에 저장된 비트맵 데이터를 다시 이미지로 렌더링하는 역할을 하고, 그 반대의 역할도 수행할 수 있다.

NSImage는 1) TIFFRepresentation 메소드를 사용하여 표현형식을 구성하는 데이터로 만든다. 이 데이터를 사용하여 2) NSBitmapImageRep 객체를 생성하고, 이 객체에서부터 3) 실제 저장이 가능한 그래픽 파일 포맷의 데이터를 생성해서 ( -representationUsingType: ), 그래픽 파일 포맷으로 만들어진 데이터를 저장해야 우리가 알고 있는 ‘그림 파일’이 만들어진다.

NSImage *currentImage; // 이 이미지는 이미 존재하는 이미지로 가정한다.  
NSString *pathToSave = ... // 파일을 저장할 경로  
NSData *imageData = [currentImage TIFFRepresentation];  
NSBitmapImageRep *rep = [NSBitmapImageRep imageRepWithData:imageData];  
NSData *dataToWrite = [rep representationUsingType:NSPNGFileType  
properties:nil];  
[dataToWrite writeToFile:pathToSave atomically:NO];

이 TIFF표현형으로부터 각 파일 포맷에 대한 저장용 데이터를 생성할 수 있다. 지원하는 포맷은 다음과 같다.

  • NSTIFFFileType : TIFF
  • NSBMPFileType : BMP
  • NSPNGFileType : PNG
  • NSJPEGFileType : JPG
  • NSGIFFileType : GIF
  • NSJPEG2000FileType : JPEG2000

이 때 전달하는 프로퍼티는 사전의 형태로 파일을 저장할 때 필요한 옵션을 지정한다. PNG로 저장하는 경우에는 인터레이스 여부만 필요하다. 그외 JPG포맷의 압축 정도나 애니메이션 GIF를 저장하는 설정 등을 다룬다. 자세한 내용은 개발자 문서를 참고.

이미지의 표현형에 대해 조금 익숙해진다면, 뷰 자체를 캡쳐하여 이를 저장하는 것도 손쉽게 가능하다. NSBitmapImageRep는 initWithFocusedViewRect: 메소드가 있어서 현재 포커스 뷰의 일부 혹은 전체 내용을 잘라, 이를 데이터로 변환한다. 역시 동일한 방식으로 뷰의 내용을 그대로 저장하는 것이 가능하다.

화면을 캡쳐할 때 iOS의 경우에는 좀 다른 방식으로 접근해야 한다. 비트맵 그래픽 컨텍스트를 만들어서 이 곳에 뷰의 CALayer를 렌더링해 넣는 방식으로 CGImage를 얻을 수 있다. 그리고 이 이미지를 다시 저장하면 된다. 이에 대해서는 별도의 포스팅으로 알아보도록 하겠다.