【问题标题】:How to make an ellipse/circular UIImage with transparent background?如何制作具有透明背景的椭圆/圆形 UIImage?
【发布时间】:2020-05-05 09:17:04
【问题描述】:

这是我正在使用的代码

extension UIImage {        
    var ellipseMasked: UIImage? {
        guard let cgImage = cgImage else { return nil }
        let rect = CGRect(origin: .zero, size: size)

        return UIGraphicsImageRenderer(size: size, format: imageRendererFormat)
            .image{ _ in
                UIBezierPath(ovalIn: rect).addClip()
                UIImage(cgImage: cgImage, scale: scale, orientation: imageOrientation)
            .draw(in: rect)
        }
    }
}

这是我得到的图像

背景颜色为黑色。 我怎样才能使背景透明? 我尝试了不同的方法,但还没有成功。

【问题讨论】:

    标签: swift uiimage transparent uibezierpath uigraphicsimagerenderer


    【解决方案1】:

    你可以继承 UIImageView 并屏蔽它的 CALayer 而不是裁剪图像本身:

    extension CAShapeLayer {
        convenience init(path: UIBezierPath) {
            self.init()
            self.path = path.cgPath
        }
    }
    

    class EllipsedView: UIImageView {
        override func layoutSubviews() {
            super.layoutSubviews()
            layer.mask = CAShapeLayer(path: .init(ovalIn: bounds))
        }
    }
    

    let profilePicture = UIImage(data: try! Data(contentsOf: URL(string:"http://i.stack.imgur.com/Xs4RX.jpg")!))!
    let iv = EllipsedView(image: profilePicture)
    

    编辑/更新

    如果您需要剪辑UIImage 本身,您可以按以下方式进行:

    extension UIImage {
        var ellipseMasked: UIImage? {
            UIGraphicsBeginImageContextWithOptions(size, false, scale)
            defer { UIGraphicsEndImageContext() }
            UIBezierPath(ovalIn: .init(origin: .zero, size: size)).addClip()
            draw(in: .init(origin: .zero, size: size))
            return UIGraphicsGetImageFromCurrentImageContext()
        }
    }
    

    对于iOS10+,你可以使用UIGraphicsImageRenderer

    extension UIImage {
        var ellipseMasked: UIImage {
            let rect = CGRect(origin: .zero, size: size)
            let format = imageRendererFormat
            format.opaque = false
            return UIGraphicsImageRenderer(size: size, format: format).image{ _ in
                UIBezierPath(ovalIn: rect).addClip()
                draw(in: rect)
            }
        }
    }
    

    let profilePicture = UIImage(data: try! Data(contentsOf: URL(string:"http://i.stack.imgur.com/Xs4RX.jpg")!))!
    profilePicture.ellipseMasked
    

    【讨论】:

    • 感谢您的回答!但是,我想要的是 UIImage,而不是 UIImageView。该 UIImage 稍后可能会传递给其他用户。
    • @LeoDabus 非常感谢! ???
    • @LeoDabus 非常感谢!它就像一个迷人的!我直接设置了imageRendererFormat.opaque = false,没用。你能解释一下为什么当你使用临时变量时它会起作用吗?
    • @LeoDabus 感谢您的解释!你拯救了我的一天!
    • 我刚刚在这段代码的帮助下为我的一个项目添加了一项新功能。再次感谢! @LeoDabus github.com/guoyingtao/Mantis/#credits
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2012-12-17
    • 2011-09-25
    相关资源
    最近更新 更多