如何提高UIImageView的渲染图像质量?

发布于 2025-01-28 18:55:03 字数 1218 浏览 2 评论 0原文

我有一个uiimageView contentmode = .aspectFit。我在ImageView中有一个图像,哪个维度大于ImageView的大小。用户可以绘制一些线条并将其保存为Sublayer。之后,我需要保存编辑的图像。但是保存图像的质量比我加载的图像质量差。 我在做什么错?我试图使用变换,但它不起作用。

import UIKit

extension UIImageView {
    
    var contentClippingRect: CGRect {
        let imgViewSize = self.frame.size
        let imgSize = self.image?.size ?? .zero
        let scaleW = imgViewSize.width / imgSize.width
        let scaleH = imgViewSize.height / imgSize.height
        let aspect = fmin(scaleW, scaleH)
        
        let width = imgSize.width * aspect
        let height = imgSize.height * aspect
        
        let imageRect = CGRect(x: (imgViewSize.width-width)/2 + self.frame.origin.x, y: (imgViewSize.height-height)/2 + self.frame.origin.y, width: width, height: height)
        return imageRect
    }
    
    func asImage() -> UIImage {
        let imageRect = self.contentClippingRect
        let renderer = UIGraphicsImageRenderer(bounds: imageRect)
        let renderedImage = renderer.image { rendererContext in
            layer.render(in: rendererContext.cgContext)
        }

        return renderedImage
    }
}

I have an UIImageView with contentMode = .aspectFit. I have an image in imageView, which dimension is bigger than size of imageView. User can draw some lines and save them as sublayer. After that I need to save the edited image. But quality of saved image is worse than quality of image which I load.
What am I doing wrong? I tried to use transform, but it didn't work.

import UIKit

extension UIImageView {
    
    var contentClippingRect: CGRect {
        let imgViewSize = self.frame.size
        let imgSize = self.image?.size ?? .zero
        let scaleW = imgViewSize.width / imgSize.width
        let scaleH = imgViewSize.height / imgSize.height
        let aspect = fmin(scaleW, scaleH)
        
        let width = imgSize.width * aspect
        let height = imgSize.height * aspect
        
        let imageRect = CGRect(x: (imgViewSize.width-width)/2 + self.frame.origin.x, y: (imgViewSize.height-height)/2 + self.frame.origin.y, width: width, height: height)
        return imageRect
    }
    
    func asImage() -> UIImage {
        let imageRect = self.contentClippingRect
        let renderer = UIGraphicsImageRenderer(bounds: imageRect)
        let renderedImage = renderer.image { rendererContext in
            layer.render(in: rendererContext.cgContext)
        }

        return renderedImage
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无可置疑 2025-02-04 18:55:03

您可以使用uigraphicsimagerendererformat()。缩放它将增加渲染图像的质量。

import UIKit

extension UIImageView {

var contentClippingRect: CGRect {
    let imgViewSize = self.frame.size
    let imgSize = self.image?.size ?? .zero
    let scaleW = imgViewSize.width / imgSize.width
    let scaleH = imgViewSize.height / imgSize.height
    let aspect = fmin(scaleW, scaleH)
    
    let width = imgSize.width * aspect
    let height = imgSize.height * aspect
    
    let imageRect = CGRect(x: (imgViewSize.width-width)/2 + self.frame.origin.x, y: (imgViewSize.height-height)/2 + self.frame.origin.y, width: width, height: height)
    return imageRect
}

func asImage() -> UIImage {
    let imageRect = self.contentClippingRect
    
    //add this
    let format = UIGraphicsImageRendererFormat()
    format.scale = 2

    let renderer = UIGraphicsImageRenderer(bounds: imageRect, format: format)
    let renderedImage = renderer.image { rendererContext in
        layer.render(in: rendererContext.cgContext)
    }

    return renderedImage
}
}

You can use UIGraphicsImageRendererFormat().scale it will increase quality of the rendered image a bit.

import UIKit

extension UIImageView {

var contentClippingRect: CGRect {
    let imgViewSize = self.frame.size
    let imgSize = self.image?.size ?? .zero
    let scaleW = imgViewSize.width / imgSize.width
    let scaleH = imgViewSize.height / imgSize.height
    let aspect = fmin(scaleW, scaleH)
    
    let width = imgSize.width * aspect
    let height = imgSize.height * aspect
    
    let imageRect = CGRect(x: (imgViewSize.width-width)/2 + self.frame.origin.x, y: (imgViewSize.height-height)/2 + self.frame.origin.y, width: width, height: height)
    return imageRect
}

func asImage() -> UIImage {
    let imageRect = self.contentClippingRect
    
    //add this
    let format = UIGraphicsImageRendererFormat()
    format.scale = 2

    let renderer = UIGraphicsImageRenderer(bounds: imageRect, format: format)
    let renderedImage = renderer.image { rendererContext in
        layer.render(in: rendererContext.cgContext)
    }

    return renderedImage
}
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文