티스토리 뷰
[iOS] UIImage 의 사용 (load, imageView, picker, resize, stretch)
beankhan 2016. 11. 28. 11:24기본 이미지 데이터와 출력
[UIImage imageNamed:] 라는 클래스 메소드를 사용하면 아래와 같은 장점이 있다.
- 앱의 기본번들에 대한 경로를 지정하지 않아도 mainBundle 로부터 이미지를 찾아 로드한다. - 파일 확장자를 이용하지 않아도 PNG 이미지를 자동으로 로드한다. - 이미지를 로드할 때 화면의 크기를 고려한다. (scale - @2x, device - ~iphone, ~ipad) - 메모리 캐시 기능을 사용한다. 같은 이미지를 이미 로드한 상태에서 로드 요청을 받으면 기존에 로드한 이미지를 리턴한다. |
[UIImage imageWithContentsOfFile:]
mainBundle 에 없는 이미지를 로드할 경우 사용된다.
이때 확장자까지 모두 붙어야 로드가 가능하다.
[UIImage imageWithData:]
파일이나 네트워크 연결을 통해 이미지를 NSData 로 가져온 경우 UIImage 로 로드할 수 있다.
[UIImage imageWithCGImage:]
Core Graphics 이미지로부터 이미지 객체를 생성할 수 있다.
CGImageRef myCGImage = [myImage CGImage];
CGRect subRect = CGRectMake(20, 20, 120, 120);
CGImageRef cgCrop = CGImageCreateWithImageInRect(myCGImage, subRect);
UIImage *cropImage = [UIImage imageWithCGImage:cgCrop];
CoreImage 로부터도 만들 수 있는데, 아래 설명한다.
이미지 출력
UIImageView 를 UIImage 를 가지고 만들면 UIImageView 의 frame 값은 UIImage 의 크기 값을 가진다.
UIImageView *view = [UIImageView alloc] initWithImage:image];
이때 UIImageView 의 content mode 에 따라 이미지를 원하는대로 출력할 수 있다. (aspect fit, aspect fill, to fill ...)
(http://beankhan.tistory.com/40)
안드로이드의 9-patch 이미지처럼 특정 부분을 stretch 시킬 수 있다.
UIImage *stretchImage = [startImage resizeableImageWithCapInset:edgeInset];
Image Picker 사용
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setAllowsEditing:YES];
[imagePicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
[imagePicker setMediaTypes:@[(NSString*)kUTTypeImage]];
[imagePicker setDelegate:self];
UIImagePickerController 를 생성 및 초기화 후 어느 미디어로부터 이미지를 얻을 지 결정한다.
(UIImagePickerControllerSourceTypePhotoLibrary,
UIImagePickerControllerSourceTypeCamera,
UIImagePickerControllerSourceTypeSavedPhotosAlbum)
또한 mediaType 을 주어 이미지를 선택할지 비디오를 선택할 지 설정할 수 있다.
kUTTypeImage, kUTTypeJPEG, kUTTypeJPEG2000, kUTTypeTIFF,
kUTTypePICT, kUTTypeGIF, kUTTypePNG, kUTTypeQuickTimeImage,
kUTTypeAppleICNS, kUTTypeBMP, kUTTypeICO, kUTTypeRawImage,
kUTTypeScalableVectorGraphics, kUTTypeLivePhoto
선택한 이미지의 편집을 허락 또는 금지할 수 있는 옵션도 있다. (setAllowsEditing:)
이미지 선택에 대한 결과값을 받을 수 있게 delegate 를 설정한다.
결과값 델리게이트는 아래와 같다.
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
info 는 이와같은 값이 온다.
키 |
값 |
UIImagePickerControllerMediaType |
kUTTypeImage 혹은 kUTTypeMovie 와 같이 어떤 타입을 선택했는지 나타내는 NSString 상수 |
UIImagePickerControllerOriginalImage |
사용자가 선택한 원본 이미지 |
UIImagePickerControllerEditedImage |
사용자가 선택한 이미지로, 편집 효과를 적용한 파일 |
UIImagePickerControllerCropRect |
원본 이미지에서 잘라낸 사각형 영역의 정보를 담고 있는 NSValue 값으로 이미지 편집을 하지 않았으면 사용할 수 없다. |
UIImagePickerControllerMediaURL |
장치의 파일 시스템 상에서 movie 데이터의 위치를 가리키는 NSURL 변수로, 타입이 image 이면 사용할 수 없다. |
UIImagePickerControllerReferenceURL |
ALAsset 객체를 가리키는 NSURL 객체로, 에셋과 직접 통신할 때 사용된다. |
UIImagePickerControllerMediaData |
카메라로 찍은 사진에 대한 메타데이터를 담고있는 NSDictionary 로 사진 라이브러리에서 가져온 이미지나 영화에서는 사용할 수 없다. |
이미지 Resize
UI 를 멋지게 관리하고 싶다면, 가능한 한 이미지 크기를 작게하는 것이 좋다.
이미지가 클수록 이미지를 처리하기 위해 더 많은 메모리를 사용해야하기 때문이다.
이미지 크기를 재조정하려면 Core Graphics 를 이용해야한다.
UIImage 의 drawInRect 함수를 이용하게 되는데, UIImage Category 로 빼놓는 것이 좋다.
UIImage(Private)
- (UIImage *)scaleImageToSize:(CGSize)newSize {
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
CGFloat originX = 0.0;
CGFloat originY = 0.0;
CGRect destinationRect =
CGRectMake(originX, originY, newSize.width, newSize.height);
[self drawInRect:destinationRect];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
제일 먼저 Core Graphics Context 를 resize 하려는 size 로 만든다. (canvas 라 생각하면 될듯)
UIGraphicsBeginImageContextWithOptions 의 2번째 parameter 는 투명도 (YES -> 불투명, NO -> 투명),
3번째는 이미지의 크기 비율 (2.0 -> @2x, 3.0 -> @3x, 0.0 -> device 에 따라) 을 나타낸다.
drawInRect 를 통해 이미지를 새로운 크기에 맞게 재조정한다.
이때, drawInRect 는 aspect fit, aspect fill 과 달리 to fill 처럼 그려지므로,
이미지의 컨텐츠가 왜곡되어 보일 수 있다.
이후 현재 context 위에 그려진 이미지를 반환하고, context 를 종료한다.
'iOS 개발 > iOS' 카테고리의 다른 글
[iOS] 안면 인식 (CIDetector) (0) | 2016.11.29 |
---|---|
[iOS] CoreImage Filter (CIFilter) 사용하기 (0) | 2016.11.28 |
[iOS] UIImage, CIImage, CGImage 의 차이점 (0) | 2016.11.25 |
[iOS] KeyChain 을 이용한 데이터 보호 및 앱 간 공유 (0) | 2016.11.25 |
[iOS] Background Task 만들기 (iOS 에서 지원하는 방식, 지원하지 않는 방식) (0) | 2016.11.24 |
- Total
- Today
- Yesterday
- optional
- 읽기 좋은 코드가 좋은 코드다
- UIView
- set
- Arc
- applicationWillResignActive
- CIImage
- Block
- Swift3
- NSManagedObjectContext
- RunLoop
- Swift 3.0
- Swift 3
- Swift
- dictionary
- string
- NSManagedObject
- workerThread
- Swfit
- CGImage
- ios
- thread
- docker
- NSManagedObjectModel
- EffectiveObjectiveC
- AWS
- coredata
- delegate
- 꺼내먹어요
- HTTP
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |