如何从 UIView 捕获高分辨率图像

seg*_*ggy 10 resolution image ios swift swift5

我希望你们都安全。

我知道这个问题被问了好几次,但没有得到完美的答案。

我只是想从 UIView 中捕获高分辨率的图像,主要是图像不应该是模糊的。

我已经尝试过这段代码

extension UIView {
    func asImage() -> UIImage {
            let renderer = UIGraphicsImageRenderer(size: self.bounds.size)
            let capturedImage = renderer.image {
                (ctx) in
                self.drawHierarchy(in: self.bounds, afterScreenUpdates: true)
            }
            return capturedImage
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我捕获图像并缩放时,文本变得模糊。

提前致谢

编辑 我正在尝试从 UIView 创建高分辨率图像。当我缩放图像的 1 部分时,文本变得模糊。

请检查下图

在此输入图像描述

Kom*_*ani 11

您可以按照本节contentScaleFactor中的描述设置属性以使其更加清晰。

例如,您可以使用以下代码,

extension UIView {
    
        func scale(by scale: CGFloat) {
             self.contentScaleFactor = scale
             for subview in self.subviews {
                 subview.scale(by: scale)
             }
         }
    
         func takeScreenshot(with scale: CGFloat? = nil) -> UIImage {
             let newScale = scale ?? UIScreen.main.scale
             self.scale(by: newScale)
             let format = UIGraphicsImageRendererFormat()
             format.scale = newScale
             let renderer = UIGraphicsImageRenderer(size: self.bounds.size, format: format)
             let image = renderer.image { rendererContext in
                 self.layer.render(in: rendererContext.cgContext)
             }
             return image
         }
}
Run Code Online (Sandbox Code Playgroud)

获得高分辨率图像,

let image = myView.takeScreenshot(with: 5.0)
Run Code Online (Sandbox Code Playgroud)


use*_*632 0

extension UIImage {

    convenience init(view: UIView) {

        UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)
        view.drawHierarchy(in: view.bounds, afterScreenUpdates: false)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.init(cgImage: (image?.cgImage)!)

    }
}
Run Code Online (Sandbox Code Playgroud)

使用:

let img = UIImage.init(view: self.yourView)
Run Code Online (Sandbox Code Playgroud)