[iOS] Bitmap Image Context

대부분의 iOS 개발서적은 UIGraphicsBeginImageContext()를 이용한 화면 캡쳐 내용을 포함하고 있다. 그러나 아쉽게도 본인이 봤던 개발서에는 UIGraphicsBeginImageContext()의배경 설명 없이 스킬 위주로만 설명이 되어 있어 이를 활용하는데 어려움이 있었다. 이번 포스팅에서는 Bitmap Image Context에 대해 간단히 정리해본다.

iOS developer library의 Drawing and Creating Images 에 다음과 같은 설명이 있다.

Most of the time, it is fairly straightforward to display images using standard views. However, there are two situations in which you may need to do additional work:

두 번째 항목으로부터  bitmap image context의 용도를 파악할 수 있다.  화면에 바로 나타나지 않는 – offscreen – 이미지를 생성하고 싶을 때는 반드시 bitmap image context를 생성해야 한다.

bitmap image context를 생성하는 함수가 바로 UIGraphicsBeginImageContext()다. 화면 캡쳐를 생각해보면, 화면을 캡쳐한 이미지는 화면에 보이진 않고 내부적으로 생성되어 사진앨범에 저장된다.

UIKit에서 지원하는 UIGraphicsBeginImageContextWithOptions( CGSize size, BOOL opaque, CGFloat scale ) 함수는 iOS 4.0 이후부터 지원되며 각 옵션은 다음을 나타낸다.

  • size : bitmap context 사이즈. 생성될 이미지 사이즈와 연관있다. 
  • opaque : 생성될 이미지의 투명도 여부. 생성할 이미지가 투명도(alpha)를 가지고 있으면 NO, 불투명하면 YES. ( YES 의 퍼포먼스가 더 높다.)
  • scale : 0.0 이면 디바이스의 화면에 맞게 이미지가 결정된다. 개발자가 임의의 값을 넣을 수도 있다.

예를 들어 UIGraphicsBeginImageContextWithOptions(CGSizeMake(100.0,100.0), NO, 2.0) 으로 생성되는 이미지의 크기는 200 x 200으로 size 값에 scale 을 곱한 값이다.

iOS 4.0 이전에 지원했던 UIGraphicsBeginImageContext(CGSize size) 함수는 UIGraphicsBeginImageContextWithOptions 에서 scale = 1.0 인 것으로 레티나 디스플레이에서는 UIGraphicsBeginImageContext()로 생성된 이미지가 만족스럽지 않을 수도 있다.

UIGraphicsBeginImageContext를 이용한 이미지 생성은 보통 다음의 단계를 따른다.

-(void)createBitmapImage{

    // 1. bitmap context를 생성하고 이를 graphics stack에 넣는다.
    UIGraphicsBeginImageContextWithOptions(imageSize, NO, [UIScreen mainScreen].scale);

   // 2. UIKit 또는 Core Graphics 루틴을 활용하여 bitmap context에 이미지를 그린다.
   // ex) [UIImage drawInRect:], [CALayer renderInContext:] 등

    // 3. bitmap context로부터 이미지를 받아온다.
    UIImage *createdImage = UIGraphicsGetImageFromCurrentImageContext();

    // 4. bitmap context를 graphics stack으로부터 빼낸다.(bitmap context를 종료한다.)
    UIGraphicsEndImageContext();
}

(1)번에서 생성하는 bitmap context의 크기 – CGSize parameter 값 – 과 (2)에서 그릴 이미지 크기가 같아야(당연히 비율도 맞아야) 이미지 왜곡이 생기지 않는다. 만약 그릴 이미지 크기가 bitmap 크기보다 크다면 image가 짤린 것처럼 나올 수도 있다.

* Reference : iOS Developer Library – Drawing and Creating Images

Advertisements
Leave a comment

1 Comment

  1. UIScrollView 컨텐츠 영역 화면 캡쳐하기 | Park's Park

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: