본문 바로가기
iOS

PHImageManager의 requestImage targetSize 문제..?

by vapor3965 2021. 11. 26.

목차

     

    사용자 사진을 asset으로 불러와서 requestImage 메소드에 targetSize만큼 지정하여

    targetSize만큼 적용된 이미지를 저장하려고 하는데... 문제가 있다.

     

    공식문서도 다 보고, 다른 분들의 블로그도 참고하여 requestImage의 각 파라미터들을 적절하게 정했는데도 

    이미지가 원하는 targetSize만큼 나오지 않고 있다. 

     

    목적

    이미지를 무조건 1:1비율로 저장하고자 한다. 

    1:1비율이 아닌 이미지는 적절히 aspectFil을 통하여 1:1비율로 자동으로 맞추어 이미지가 짤리거나, 하고 싶다.

     

    문제

    targetSize360보다 큰 사이즈로 잡는 다면, 원본 이미지로 나오게 된다.

    • 예를 들어, 원본 이미지가 1100 * 2000 이라면, 이 크기로 나오게 된다. 
      • 원본 이미지가 1:1비율이 아니므로, 의도한 바와 다르게 짤리지도 않고, 그대로 나온다. 

    반면 360이하인 사이즈로 잡는다면, 목적에 맞게 잘 나온다. 

     

    알게된 이유?

    고정적인 사이즈보다는 디바이스 크기별로 이미지를 저장하고 싶었기 때문에,

    UIScreen.main.bounds.width 를 이용하여 targetSize를 정했다. 

    하지만, 360보다 큰 디바이스의 경우 ( iPhone 12 pro )는 390인데, 이 경우에는 원본 이미지로 계속 나오고 있었다.

    하지만 360이하인 값으로 targetSize를 정하니 이미지가 적당히 잘 짤리면서 1:1비율로 잘 나왔다. 

     

     

    코드

    resizeMode를 통해서 정확히 targetSize만큼 나오도록 옵션을 지정했고, 동기로 지정함으로써, 반환이미지도 한번만 호출되도록 했다. 

    targetSize를  iPhon12pro 에서, UIScreen.main.bounds.width 로 width, height둘다 지정하면 원본사이즈로 크게 나온다. ( 원본 사이즈가 1:1비율이 아니라면 원본비율로 나온다. ) 

    let options: PHImageRequestOptions = PHImageRequestOptions()
    options.isSynchronous = true
    options.resizeMode = .exact
    
    PHImageManager.default().requestImage(for: asset,
                                          targetSize: CGSize(width: 360, height: 360),
                                          contentMode: .aspectFill,
                                          options: options) { image, _ in
    		guard let image = image else { return }
            print(image.size)
        }

     

     

     

    결국 360 이하로 잡아야 문제가 해결되지만 왜 360보다 큰 사이즈에서는 기대와 다른 값이 나오는지 아직도 모르겠다. 😭

     

     

    그래서 https://beankhan.tistory.com/241 이분의 블로그를 보면 targetSize에 따른 수행시간을 측정하셨는데, 

    360보다 크게되면 현저히 시간이 느려진다라고 나와있다. 

    지금 내가 쓴 글에 의하면, 360보다 큰 사이즈는 원본사이즈로 나오려고 하기 때문에, 원본사이즈가 클수록 현저히 느려질 수 밖에 없다라고 생각한다. 

    댓글