CGImage.cropping () 고려 사항

11647 단어 SwiftiOS

입문


이전에 발표된 AR Mini Sketch 응용 프로그램에서는 사용자가 지정한 범위 내에서 UIIMageView의 이미지를 잘라내는 처리가 있었지만 이미지에 따라 지정한 방식으로 잘라낼 수 없는 문제가 있습니다.
원인을 조사한 결과 CGImage가 발견되었습니다.cropping () 의 범위 지정은 원래 이미지의 방향을 고려해야 한다는 것을 알았기 때문에 주의점을 메모로 남깁니다.

CG 이미지 클래스


CG 이미지 클래스는 핵심 그래픽 이미지의 약자입니다.
비트맵 이미지로서 이미지의 마스크 처리나 커팅 처리를 할 수 있습니다.
이 종류는width와height 속성을 가지고 있지만orientation 속성은 없습니다.

UIimage 클래스란 무엇입니까?


iOS 응용 프로그램에서 이미지를 조작할 때 가장 흔히 볼 수 있는 클래스입니다.
자원의 이미지 파일을 읽을 때도 대부분 이 종류의 실례로 작동한다.
UIImage.cg 이미지에서 해당 이미지의 GC 이미지를 참조할 수 있습니다.
또한 이 종류는orientation이라는 속성을 가지고 이미지의 방향 정보를 유지합니다.

CGImage.cropping ()


정의

func cropping(to rect: CGRect) -> CGImage?
rect에서 지정한 범위를 그어 새 CG 이미지의 실례를 되돌려줍니다

주의사항


rect는 잘라낼 CG 이미지의 척도로 지정해야 합니다.
구체적인 예가 제시된 상황에서 400x200 크기의 CG 이미지의 한가운데에서 50x50으로 이미지를 잘라내려면 CGRect의 매개 변수는 다음과 같다.
let rect = CGRect(x: 200 - 25, y: 100 - 25, width: 50, height: 50)
또한 UIimageView와 UIimageView가 표시하는 UIimage의 크기가 일치하지 않기 때문에 UIimageView에서 지정한 범위를 실제 CG 이미지의 척도로 재조정해야 합니다.

예를 들어 위의 그림에서 보듯이 UIIMageView의 디스플레이 크기는 400x1000이고 실제 UIIMage의 크기는 800x1200인 경우 선택 범위의 Rect는 다음과 같이 척도를 변경해야 한다.
let transform = CGAffineTransform(scaleX: 2.0, y: 1.2)
rect.applying(transform)

본론


그럼 매번 UIIMageView의 사이즈와 UIIMage(CG Image)의 사이즈를 측정해서 지정된 범위의 규모를 변경하면 되는 것이 아니라 함정이 있습니다.
웹 사이트 축소 이미지의 설명은 이해하기 쉽지만 이미지에서orientation이라는 속성을 유지하고 UII MageView에서 세로로 이미지를 표시하더라도 CG 이미지의 단계에서 누울 때가 있다.
이렇게 되면 아래 그림에서 보듯이 단순히 척도를 변경하면 의도된 장소에서 벗어난다.

따라서 CGImage는 UIIMageView에 지정된 범위 내에서 수행됩니다.cropping () 을 실행할 때 다음과 같은 논리로 처리해야 합니다.

1. UIIMageView로 표시되는 UIIMage의 종횡 비율 가져오기


2. UIIMage의 오리엔테이션을 가져와 이미지의 방향을 결정합니다.


3. 이미지 방향에 따라 범위의 회전 및 평행 이동


4. 방금 계산한 비율로 범위를 확대/축소


실제로 쓰면 이런 느낌이에요.

extension UIImageView {
    func transformByImage(rect : CGRect) -> CGRect? {
        guard let image = self.image else { return nil }
        let imageSize = image.size
        let imageOrientation = image.imageOrientation
        let selfSize = self.frame.size

        let scaleWidth = imageSize.width / selfSize.width
        let scaleHeight = imageSize.height / selfSize.height

        var transform: CGAffineTransform

        switch imageOrientation {
        case .left:
            transform = CGAffineTransform(rotationAngle: .pi / 2).translatedBy(x: 0, y: -image.size.height)
        case .right:
            transform = CGAffineTransform(rotationAngle: -.pi / 2).translatedBy(x: -image.size.width, y: 0)
        case .down:
            transform = CGAffineTransform(rotationAngle: -.pi).translatedBy(x: -image.size.width, y: -image.size.height)
        default:
            transform = .identity
        }

        transform = transform.scaledBy(x: scaleWidth, y: scaleHeight)

        return rect.applying(transform)
    }
}
이런 느낌으로 사용하세요.
let cropRect = self.cropRect
let imageView = self.imageView

guard let image = imageView?.image else { return }
guard let rectByImage = imageView?.transformByImage(rect : cropRect) else { return }

let croppedImage = image.cgImage.cropping(to: rectByImage)
let newImage = UIImage(cgImage: croppedImage!, scale: imageView.scale, orientation: image.imageOrientation)
누구를 도울 수 있다면 나는 매우 기쁠 것이다.

좋은 웹페이지 즐겨찾기