Files
Schnappix/node_modules/expo-image-manipulator/ios/Transformers/ImageRotateTransformer.swift
T

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))
}
}
}