2013년 11월 18일 월요일

[iOS] ScreenShot으로 현재 화면을 UIImage로 만들자


사용자에게 현재 화면의 ScreenShot 을 만들어서 Email에 첨부하고 싶다면..
CALayer의 -renderInContext를 이용해서 화면을 그대로 이미지로 만들 수 있다.

(출처: https://developer.apple.com/library/ios/qa/qa1703/_index.html)

먼저 스크린의 크기를 가져와야 되는데, iOS4부터 Retina Display가 나오면서, Scale로 구분을 하도록 변경이 되었다. 그래서, scale을 고려해서 화면 Size를 가져와야 한다.

화면크기를 확보를 했으면, 이제 UIContextRef를 가져오고, 이미지를 읽어 온다.

Source Code

- (UIImage*)screenshot 
{
    // Create a graphics context with the target size
    // On iOS 4 and later, use UIGraphicsBeginImageContextWithOptions to take the scale into consideration
    // On iOS prior to 4, fall back to use UIGraphicsBeginImageContext
    CGSize imageSize = [[UIScreen mainScreen] bounds].size;
    if (NULL != UIGraphicsBeginImageContextWithOptions)
        UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
    else
        UIGraphicsBeginImageContext(imageSize);

    CGContextRef context = UIGraphicsGetCurrentContext();

    // Iterate over every window from back to front
    for (UIWindow *window in [[UIApplication sharedApplication] windows]) 
    {
        if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen])
        {
            // -renderInContext: renders in the coordinate space of the layer,
            // so we must first apply the layer's geometry to the graphics context
            CGContextSaveGState(context);
            // Center the context around the window's anchor point
            CGContextTranslateCTM(context, [window center].x, [window center].y);
            // Apply the window's transform about the anchor point
            CGContextConcatCTM(context, [window transform]);
            // Offset by the portion of the bounds left of and above the anchor point
            CGContextTranslateCTM(context,
                                  -[window bounds].size.width * [[window layer] anchorPoint].x,
                                  -[window bounds].size.height * [[window layer] anchorPoint].y);

            // Render the layer hierarchy to the current context
            [[window layer] renderInContext:context];

            // Restore the context
            CGContextRestoreGState(context);
        }
    }

    // Retrieve the screenshot image
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return image;
}
(출처: https://developer.apple.com/library/ios/qa/qa1703/_index.html)


위 함수를 이용해서 이미지를 읽어오면, 디바이스의 화면 크기에 맞는 이미지가 생성이 된다.
이것을 그대로 Email로 첨부를 하게 되면, 5.4MB정도 크기가 되어서 보내기 부담스러워 진다.
그렇게 되면 이미지의 크기를 변경해서 이미지를 표시를 하고, 그 이미지를 바탕으로 data를 가져오면 될 것이다.
큰이미지를 작은 이미지로 리사이징 하는 것은 이전 블로그(http://hidavidbae.blogspot.kr/2012/12/ios6.html)를 참고하여 주시길..