首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用UIGraphicsImageRenderer旋转图像?

使用UIGraphicsImageRenderer旋转图像?
EN

Stack Overflow用户
提问于 2016-08-23 05:39:29
回答 3查看 3.4K关注 0票数 3

UIGraphicsImageRenderer是在iOS 10中新引入的。我想知道是否有可能用它来旋转UIImage (任何自定义角度)。我知道有CGContextRotateCTMclassic way

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-26 02:04:26

您可以设置UIGraphicsImageRenderer来创建图像,然后调用UIGraphicsGetCurrentContext()并旋转上下文

代码语言:javascript
运行
复制
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
票数 4
EN

Stack Overflow用户

发布于 2020-07-10 20:29:08

基于@reza23的答案。你不需要调用UIGraphicsGetCurrentContext,你可以使用渲染器的上下文。

代码语言:javascript
运行
复制
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:newSize)
        
        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
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-08-24 05:54:46

浏览文档,也由于缺乏对这个问题的回复,我假设新的UIGraphicsImageRenderer不可能做到这一点。这是我在一天结束时解决这个问题的方法:

代码语言:javascript
运行
复制
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对应于绘制旋转图像而不更改其整体大小所需的矩形区域。然后旋转图像并将其绘制在中心。有关这方面的详细信息,请参阅此post

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39089148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档