Повернуть изображение с помощью UIGraphicsImageRenderer?

UIGraphicsImageRenderer был недавно представлен в iOS 10. Мне было интересно, есть ли возможность повернуть UIImage с ним (любой нестандартный угол). Я знаю, что есть классический способ CGContextRotateCTM,

2 ответа

Решение

Вы можете настроить UIGraphicsImageRenderer для создания изображения и с этим вызвать UIGraphicsGetCurrentContext() и повернуть контекст

    let renderer = UIGraphicsImageRenderer(size:sizeOfImage )
    let image = renderer.image(actions: { _ in
        let context = UIGraphicsGetCurrentContext()

        context?.translateBy(x: orgin.x, y: orgin.y)
        context?.rotate(by: angle)
        context?.draw(image.cgImage!, in: CGRect(origin: CGPoint(x: -orgin.x,y: -orgin.y), size: size))
    }
return image

Построен на ответе @reza23

extension UIImage
{
    public func rotate(angle:CGFloat)->UIImage
    {
        let radians = CGFloat(angle * .pi) / 180.0 as CGFloat
        
        var newSize = CGRect(origin: CGPoint.zero, size: self.size).applying(CGAffineTransform(rotationAngle: radians)).size
        
        // Trim off the extremely small float value to prevent core graphics from rounding it up
        newSize.width = floor(newSize.width)
        newSize.height = floor(newSize.height)
        let renderer = UIGraphicsImageRenderer(size:self.size)
        
        let image = renderer.image
        { rendederContext in
            
            let context = rendederContext.cgContext
            //rotate from center
            context.translateBy(x: newSize.width/2, y: newSize.height/2)
            context.rotate(by: radians)
            draw(in:  CGRect(origin: CGPoint(x: -self.size.width/2, y: -self.size.height/2), size: size))
        }
        
        return image
    }
}

Просматривая документацию, а также из-за отсутствия ответов на этот вопрос, я предполагаю, что это невозможно с новым UIGraphicsImageRenderer, Вот как я решил это в конце дня:

func changeImageRotation(forImage image:UIImage, rotation alpha:CGFloat) -> UIImage{

    var newSize:CGSize{
        let a = image.size.width
        let b = image.size.height

        let width = abs(cos(alpha)) * a + abs(sin(alpha)) * b
        let height = abs(cos(alpha)) * b + abs(sin(alpha)) * a

        return CGSize(width: width, height: height)
    }

    let size = newSize
    let orgin = CGPoint(x: size.width/2, y: size.height/2)

    UIGraphicsBeginImageContext(size)
    let context = UIGraphicsGetCurrentContext()

    context?.translateBy(x: orgin.x, y: orgin.y)
    context?.rotate(by: alpha)
    context?.draw(image.cgImage!, in: CGRect(origin: CGPoint(x: -orgin.x,y: -orgin.y), size: size))

    let newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage!
}

New Sizeсоответствует прямоугольной области, которая требуется для рисования повернутого изображения без изменения его общего размера. Изображение поворачивается и рисуется в центре. Для получения дополнительной информации об этом, обратитесь к этому сообщению.

Другие вопросы по тегам