felix-iOS

[iOS] UIImage 공식문서를 파헤쳐봅시다! 본문

iOS

[iOS] UIImage 공식문서를 파헤쳐봅시다!

felix-mr 2021. 6. 23. 19:08

안녕하세요 🙇‍♂️

임시저장된 글이 많지만 갑자기 UIImage에 대한 공식문서를 정확히 읽어보는 시간을 가져보고자 합니다! ㅎㅎ

UIImage 공식문서를 번역해보려고 하는데 잘못된 번역이나 오타에 대해서는 지적 부탁드립니다 :)

 

자! 시작해 보겠습니다.

 

UIImage

App에서 이미지 데이터를 관리하는 객체

 

 

개요

이미지 객체를 통해 모든 종류의 이미지 데이터를 나타내며, UIImage 클래스는 기본 플랫폼에서 지원하는 모든 이미지 형식에 대한 데이터를 관리할 수 있습니다. image object는 불변성이므로 항상 디스크에 있는 이미지 파일이나 프로그래밍 방식으로 생성된 이미지 데이터와 같은 기존 이미지 데이터에서 생성해야 합니다. 이미지 객체는 하나의 이미지 또는 애니메이션에 사용하려는 일련의 이미지들을 포함할 수 있습니다.

 

이미지 객체는 여러 방법으로 사용할 수 있다:

  • 이미지를 Interface에 표시하기 위해 UIImageView object에 할당하기
  • 이미지를 사용하여 buttons, sliders, segmented controls와 같은 시스템 컨트롤을 커스텀하기
  • View 또는 다른 그래픽 컨텍스트에 직접 이미지를 그리기
  • 이미지 데이터를 요구하는 다른 API에 이미지 전달하기

이미지 객체는 모든 플랫폼 네이티브 이미지 형식(all platform-native image format)을 지원하지만, 대부분의 이미지에는 PNG 또는 JPEG파일을 사용하는 것이 좋습니다. 이미지 객체는 PNG와 JPEG 형식을 읽고 표시하는데 최적화 되어 있으며, 두 형식은 대부분의 다른 형식들 보다 더 나은 성능을 제공합니다. PNG 형식은 무손실이기 때문에 특히 App Interface에서 사용하는 이미지에 권장된다.

 

 

자자 이미지 객체는 PNG와 JPEG 형식을 애용합시다 👍

 

 

이미지 객체 생성하기

UIImage 클래스의 메소드를 사용하여 이미지 객체를 생성하려고 할 때, 이미지 데이터가 파일 또는 데이터 구조에 위치해야 합니다. 빈 이미지를 만들어 내용을 그릴 수는 없습니다. 이미지 객체를 만드는 방법에는 여러가지 옵션이 있으며, 각 옵션들은 특정 상황에 적합하게 사용할 수 있습니다.

  • App Bundle(또는 다른 알려진 Bundle)에 위치한 image asset이나 image file로부터 이미지를 생성하려면 init(named: in: compatibleWith:) 또는 init(named:) 메소드를 사용하십시오! 이 메소드는 이미지 데이터를 자동적으로 cache에 저장하기 때문에, 특히 자주 사용되는 이미지에 권장된다.
  • 초기 데이터가 번들에 없는 이미지 객체를 생성하려면 init(contentsOfFile:) 메소드를 사용하십시오! 이 메소드는 매번 디스크에서 이미지 데이터를 로드하므로 동일한 이미지를 반복적으로 로드하는 데 사용하지 말아야합니다.
  • 여러개의 순차적인 이미지로 구성된 단일 UIImage 객체를 생성하려면 animatedImage(with: duration:)animatedImageNamed(_: duration:) 메소드를 사용하십시오! 인터페이스에 애니메이션을 만들려면 UIImageView 객체에 결과 이미지를 사용하여 생성해라.
    • ??? 마지막 문장이 이해가 안가는데 UIImageView(image:)를 사용해서 인터페이스에 표현하라는 말 같습니다.. 뇌피셜입니다..

 

init(named:)를 사용하면 자동적으로 caching이 된다는 사실 알고 계셨나요? ㅎㅎ

init 방법에 따라서 사용 목적이 나뉠 수 있다는 점에 유의해서 사용합시다!

 

 

UIImage 클래스의 다른 메소드를 사용하면 Core Graphics 이미지 또는 사용자가 직접 생성하는 이미지 데이터와 같은 특정 유형의 데이터에서 애니메이션을 만들 수 있다. UIKit는 개발자가 직접 그리는 콘텐츠에서 이미지를 생성하기 위한 UIGraphicsGetImageFromCurrentImageContext() 도 제공한다. 이 메소드는 현재 비트맵 기반 그래픽 컨텍스트의 내용에서 이미지를 반환한다.

 

 

이번 글은 UIImage 공식문서를 읽어보는 시간이기 때문에 UIGraphicsGetImageFromCurrentImageContext() 에 대해서는 다음에 알아보도록 할께요! 해당 메서드를 사용하는 좋은 예제글을 링크 걸어 놓겠습니다 :)

https://ios-development.tistory.com/395

 

[iOS - swift] UIGraphicsBeginImageContextWithOptions, 그래픽 UIImage 생성

UIGrahpicsBeginImageContext란 bitmap image context를 생성하는 함수: 그림을 그려서 UIImage로 저장하는 것 context란? 코어 이미지의 모든 프로세싱은 CIContext내에서 수행: 렌더링 과정과 렌더링에 필요한..

ios-development.tistory.com

 

Note
이미지 객체는 불변하기 때문에, 생성 후에 객체의 속성을 변경할 수 없습니다. 대부분의 이미지 속성은 동반된 이미지 파일이나 이미지 데이터의 메타데이터를 사용하여 자동으로 설정됩니다. 또한 이미지 객체의 불변성은 모든 스레드에서 안전하게 생성 및 사용할 수 있음을 의미합니다.

 

이미지 Assets은 Application과 함께 제공되는 이미지를 관리할 수 있는 가장 편한 방법입니다. 각각의 새 Xcode 프로젝트에는 여러 이미지셋을 추가할 수 있는 Assets 라이브러리가 포함되어 있습니다. 이미지셋은 Application에 사용되는 이미지의 변화(variations)를 포함합니다. 이미지셋은 플랫폼, 특성 환경(compact 또는 regular) 및 스케일 팩터에 따라 다양한 버전의 이미지를 제공할 수 있습니다.

 

디스크에서 이미지를 불러오는 것 이외에도 UIImagePickerController 객체를 사용하여 이용 가능한 카메라나 사진 라이브러리에서 이미지를 제공하도록 사용자에게 요청할 수 있습니다. Image Picker는 이미지를 선택하기 위한 사용자 인터페이스를 표시한다. 사용자가 제공한 이미지에 액세스하려면 명시적인 사용자 권한이 필요합니다. 이미지 피커에 대한 자세한 내용은 UIImagePickerController를 참조하십시오.

 

 

Stretchable Image 정의하기

Stretchable Image는 기본 이미지 데이터가 미적으로 만족스러운 방식으로 복제될 수 있는 영역을 정의하는 이미지입니다. Stretchable Image는 일반적으로 사용 가능한 공간을 채우기 위해 증가하거나 축소할 수 있는 배경을 만드는 데 사용됩니다.

 

resizableImage(withCapInsets:) 또는 resizableImage(withCapInsets: resizingMode:) 메소드를 사용해 기본 이미지에 인셋을 추가하여 Stretchable Image를 정의할 수 있습니다. insets은 이미지를 둘 이상의 부분으로 세분화합니다. 각 inset에 0이 아닌 값을 지정하면 이미지가 9개 부분으로 나뉜다.

 

각 inset은 지정된 치수로 늘어나지 않는 이미지의 부분을 정의합니다. 영상의 상단 및 하단 inset의 영역은 고정 높이를 유지하고, 왼쪽 및 오른쪽 삽입 내부의 영역은 고정 너비를 유지합니다. 아래 그림은 사용 가능한 공간을 채우기 위해 이미지 자체가 늘어남에 따라 9개 부분 이미지의 각 부분이 늘어나는 방식을 보여줍니다. 이미지의 모서리는 수평 및 수직 삽입 내부에 있으므로 크기가 변경되지 않습니다.

 

 

 

이미지 비교하기

isEqual(_:) 메소드는 두 이미지가 같은 이미지 데이터를 포함하고 있는지 아닌지 결정할 수 있는 유일한 방법이다. cache된 동일한 이미지 데이터로 초기화하는 경우에도 생성하는 image objects가 서로 다를 수 있다. 이들의 Equality를 판단하는 방법은 실제 이미지 데이터를 비교하는 isEqual(_:) 메소드를 사용하는 것이다.

let image1 = UIImage(named: "myImage")
let image2 = UIImage(named: "myImage")

if image1 != nil && image1!.isEqual(image2) {
	// 옳은 방법이다! 이 방법은 이미지 데이터를 올바르게 비교합니다.
}
if image1 == image2 {
	// 틀린 방법입니다! 직접적인 개체 비교가 작동하지 않을 수 있습니다.
}

 

 

이미지 데이터에 접근하기

image objects는 자신을 이루는 image data에 직접적으로 접근하는 방법을 제공하지 않습니다. 그러나 다른 형식의 이미지 데이터를 검색하여 앱에서 사용할 수 있습니다. 특히 cgImageciImage 속성을 사용하여 각각 Core Graphics 및 Core Image와 호환되는 이미지 버전을 검색할 수 있습니다. 또한 pngData() 또는 jpegData(compressionQuality:) 메소드를 사용하여 PNG 또는 JPEG 형식의 이미지 데이터를 포함하는 NSData 객체를 생성할 수 있습니다.

 

 

 

 

자!

 

UIImage 공식문서를 읽어봤습니다. 엄청 깊은 내용은 아니지만 기본에 일단 충실해야 한다고 생각하기 때문에 글을 작성해 봤습니다.

 

init(named:)로 객체를 생성할 때 자동으로 caching을 해주는 것은 좀 놀랍지 않나요?? ㅎㅎㅎ..

해당 글이 도움이 되셨으면 좋겠습니다 :)

 

이만 글을 마치도록 하겠습니다😅

 

 

 

Reference

https://developer.apple.com/documentation/uikit/uiimage

 

Apple Developer Documentation

 

developer.apple.com

https://ios-development.tistory.com/395

 

[iOS - swift] UIGraphicsBeginImageContextWithOptions, 그래픽 UIImage 생성

UIGrahpicsBeginImageContext란 bitmap image context를 생성하는 함수: 그림을 그려서 UIImage로 저장하는 것 context란? 코어 이미지의 모든 프로세싱은 CIContext내에서 수행: 렌더링 과정과 렌더링에 필요한..

ios-development.tistory.com

 

Comments