2012년 12월 18일 화요일

[iOS6] 큰 이미지를 작게 표시할 때..


큰 이미지를 iPhone의 작은 화면에 표시를 하거나, 작은 이미지로 사용해야 되는 경우가 많다. 이 경우에 이미지를 그대로 사용하게 되면, 이미지 사이즈가 커서 이미지를 로딩하는 메모리도 많이 사용하게 되고, 이미지를 그대로 압축해서 표시하므로, 계단현상이나 부드럽지 못한 이미지가 표시되게 된다.
이런 경우 Context를 생성하고, 거기에 DrawImage를 해서 작은 이미지와 Blend된 이미지로 표시할 수 있다.

소스
- (UIImage*)getResizedImage:(UIImage*)image inBound:(CGSize)size
{
    if (NULL != UIGraphicsBeginImageContextWithOptions)
        UIGraphicsBeginImageContextWithOptions(size, NO, 0);
    else
        UIGraphicsBeginImageContext(size);
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    // Flip the context because UIKit coordinate system is upside down to Quartz coordinate system
    CGContextTranslateCTM(context, 0.0, size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    
    // Draw the original image to the context
    CGContextSetBlendMode(context, kCGBlendModeCopy);
    CGContextDrawImage(context, CGRectMake(0.0, 0.0, size.width, size.height), image.CGImage);
    
    // Retrieve the UIImage from the current context
    UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    return imageOut;
}

설명
UIImage로 받은 큰 사이즈의 원본을 context에 작게 그리고, 그린 Context에서 UIImage를 받아오면, 작게 Blend된 이미지를 추출할 수 있게 된다.

비교


왼쪽이 원 이미지를 그대로 사용한 것이고 오른쪽이 이미지를 작게 렌더링 한 후 표시한 것입니다.
이미지를 캡춰해서 별 차이가 나지 않지만, 실제로 보면, 차이가 나고 메모리 사용량도 차이가 나는 겁니다.
 많이 필요없는 곳에 많은 데이터를 쓰고 있는 것이지요..