简体   繁体   English

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

[英]How to increase quality of rendered image for UIImageView?

I have an UIImageView with contentMode =.aspectFit .我有一个带有contentMode =.aspectFit UIImageView I have an image in imageView, which dimension is bigger than size of imageView.我在 imageView 中有一个图像,其尺寸大于 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
    }
}

You can use UIGraphicsImageRendererFormat().scale it will increase quality of the rendered image a bit.您可以使用 UIGraphicsImageRendererFormat().scale 它会稍微提高渲染图像的质量。

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
}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM