31 lines
1.1 KiB
Swift
31 lines
1.1 KiB
Swift
// Copyright 2024-present 650 Industries. All rights reserved.
|
|
|
|
/**
|
|
Transformer that creates a new image by rotating given image by the rotate angle.
|
|
*/
|
|
internal struct ImageRotateTransformer: ImageTransformer {
|
|
let rotate: Double
|
|
|
|
@MainActor
|
|
func transform(image: UIImage) async throws -> UIImage {
|
|
guard let cgImage = image.cgImage else {
|
|
throw ImageNotFoundException()
|
|
}
|
|
let rads = rotate * .pi / 180
|
|
let rotatedView = UIView(frame: CGRect(origin: .zero, size: image.size))
|
|
|
|
rotatedView.transform = CGAffineTransform(rotationAngle: rads)
|
|
|
|
let rotatedSize = CGSize(width: rotatedView.frame.size.width.rounded(.down), height: rotatedView.frame.size.height.rounded(.down))
|
|
let origin = CGPoint(x: -image.size.width / 2, y: -image.size.height / 2)
|
|
|
|
return drawInNewContext(size: rotatedSize) { context in
|
|
let cgContext = context.cgContext
|
|
cgContext.translateBy(x: rotatedSize.width / 2, y: rotatedSize.height / 2)
|
|
cgContext.rotate(by: rads)
|
|
cgContext.scaleBy(x: 1.0, y: -1.0)
|
|
cgContext.draw(cgImage, in: CGRect(origin: origin, size: image.size))
|
|
}
|
|
}
|
|
}
|