Programing
[iPhone] 이미지 썸네일
npre
2011. 10. 19. 13:59
반응형
-정사각형으로 사진을 CROP 하고, 썸네일 크기에 맞게 리사이즈-
먼저, 출처는 다음 기사입니다.
http://tharindufit.wordpress.com/2010/04/19/how-to-create-iphone-photos-like-thumbs-in-an-iphone-app/
iPhone 사진앨범의 특징은 가로나 세로가 긴 이미지라 할지라도,
정사각형으로 사진을 CROP 하고, 썸네일 크기에 맞게 리사이즈 시킵니다.
위의 기사의 내용을 나름대로 보기 편하게(?) 수정을 했습니다.
함수명 - makeThumbnailImage
파라미터 - 원본 이미지, 리사이즈없이 CROP만 할지 여부, 리사이즈할 정사각형 한변의 길이
리턴값 - CROP 및 리사이즈된 이미지
- (UIImage*) makeThumbnailImage:(UIImage*)image onlyCrop:(BOOL)bOnlyCrop Size:(float)size
{
CGRect rcCrop;
if (image.size.width == image.size.height)
{
rcCrop = CGRectMake(0.0, 0.0, image.size.width, image.size.height);
}
else if (image.size.width > image.size.height)
{
int xGap = (image.size.width - image.size.height)/2;
rcCrop = CGRectMake(xGap, 0.0, image.size.height, image.size.height);
}
else
{
int yGap = (image.size.height - image.size.width)/2;
rcCrop = CGRectMake(0.0, yGap, image.size.width, image.size.width);
}
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rcCrop);
UIImage* cropImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
if (bOnlyCrop) return cropImage;
NSData* dataCrop = UIImagePNGRepresentation(cropImage);
UIImage* imgResize = [[UIImage alloc] initWithData:dataCrop];
UIGraphicsBeginImageContext(CGSizeMake(size,size));
[imgResize drawInRect:CGRectMake(0.0f, 0.0f, size, size)];
UIImage* imgThumb = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[imgResize release];
return imgThumb;
}
위 소스를 참고하시면, 이미지를 CROP 하는 방법이나, 이미지를 RESIZE 하는 방법을 참고하실수 있을겁니다.
사족을 붙이자면, 왜 Resize 할지 여부를 따로 분리 시킨 이유는 실제로 사용을 해보면 Resize 루틴에서
많은 CPU 부하가 걸립니다. 그래서 UIImageView 에 contentMode를 UIViewContentModeScaleAspectFit 로 설정해서
자체적으로 리사이즈를 하게 하는 방법이 비동기적으로 괜찮습니다. (물론.. 실제 Resize된 이미지가 아니므로 메모리적인 소비는 있습니다.)
먼저, 출처는 다음 기사입니다.
http://tharindufit.wordpress.com/2010/04/19/how-to-create-iphone-photos-like-thumbs-in-an-iphone-app/
iPhone 사진앨범의 특징은 가로나 세로가 긴 이미지라 할지라도,
정사각형으로 사진을 CROP 하고, 썸네일 크기에 맞게 리사이즈 시킵니다.
위의 기사의 내용을 나름대로 보기 편하게(?) 수정을 했습니다.
함수명 - makeThumbnailImage
파라미터 - 원본 이미지, 리사이즈없이 CROP만 할지 여부, 리사이즈할 정사각형 한변의 길이
리턴값 - CROP 및 리사이즈된 이미지
- (UIImage*) makeThumbnailImage:(UIImage*)image onlyCrop:(BOOL)bOnlyCrop Size:(float)size
{
CGRect rcCrop;
if (image.size.width == image.size.height)
{
rcCrop = CGRectMake(0.0, 0.0, image.size.width, image.size.height);
}
else if (image.size.width > image.size.height)
{
int xGap = (image.size.width - image.size.height)/2;
rcCrop = CGRectMake(xGap, 0.0, image.size.height, image.size.height);
}
else
{
int yGap = (image.size.height - image.size.width)/2;
rcCrop = CGRectMake(0.0, yGap, image.size.width, image.size.width);
}
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rcCrop);
UIImage* cropImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
if (bOnlyCrop) return cropImage;
NSData* dataCrop = UIImagePNGRepresentation(cropImage);
UIImage* imgResize = [[UIImage alloc] initWithData:dataCrop];
UIGraphicsBeginImageContext(CGSizeMake(size,size));
[imgResize drawInRect:CGRectMake(0.0f, 0.0f, size, size)];
UIImage* imgThumb = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[imgResize release];
return imgThumb;
}
위 소스를 참고하시면, 이미지를 CROP 하는 방법이나, 이미지를 RESIZE 하는 방법을 참고하실수 있을겁니다.
사족을 붙이자면, 왜 Resize 할지 여부를 따로 분리 시킨 이유는 실제로 사용을 해보면 Resize 루틴에서
많은 CPU 부하가 걸립니다. 그래서 UIImageView 에 contentMode를 UIViewContentModeScaleAspectFit 로 설정해서
자체적으로 리사이즈를 하게 하는 방법이 비동기적으로 괜찮습니다. (물론.. 실제 Resize된 이미지가 아니므로 메모리적인 소비는 있습니다.)
[출처] 아이폰 OS 개발 자료 총정리|작성자 김민석