본문 바로가기
iOS

UIImage에서 만든 MTLTexture의 orientation이 이상할 때

by 워뇨옹2 2023. 2. 25.
728x90
반응형

이번에 앱을 만들면서 쉐이더를 돌릴 일이 있어서 UIImage에서 MTLTexture를 만들었는데, Orientation이 내가 의도한 것과 다르게 나왔다.

 

UIImage Orientation

UIImage에는 imageOrientation이라는 get property가 있는데, 일반적으로 다운로드한 파일은 .up 값을 가진다.

하지만 핸드폰에서 직접 찍은 사진들은 가로로 찍었는지, 세로로 찍었는지에 대해 각각 다른 값을 가진다. 기본적으로 사진을 찍을 때 사용하는 pixelBuffer는 landScape가 기준이다. 한마디로 가로가 긴 이미지를 사용하게 된다는 것이다. 근데, 사진을 찍을 때 우리가 핸드폰을 어떻게 들지? 정방향으로 들수도 있고, 시계방향 가로로 들수도, 반시계, 180도 회전해서 들수도 있다. 근데 앞서 말했듯 픽셀 버퍼는 가로로 생성되기 때문에 이 모든 경우를 담을 수 있도록 Orientation을 설정한거고 덕분에 어느 방향에서 찍었는지 확인한 뒤 앨범에서 정상적으로 이미지가 표시되는 것이다.

근데 이걸 Texture로 표시한다면? Orientation의 정보는 없고 이미지만 변환하기 때문에 가로로 된 이미지만 나오게 될 것이다.

그러니 UIimage의 오리엔테이션을 없애고 방향대로 이미지를 새로 만들어서 텍스처로 변환하자는 생각이 도출된 것이다.

 

Code

이미지를 새로 만드는 코드는 다음과 같다.

    func normalizedImage() -> UIImage? {
        if (self.imageOrientation == .up) { return self }
        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale);
        self.draw(in: CGRect(origin: .zero, size: size))
        let normalizedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return normalizedImage;
    }

결과

.up 값은 정방향이고, 이렇게 이미지를 새로 만들면 기본값인 정방향의 이미지가 되기 때문에 texture가 정상적인 orientation을 가지게 된다. 

728x90
반응형