티스토리 뷰



기본 이미지 데이터와 출력


[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 allocinit];


[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 를 종료한다.





공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함