让UIImage成为一个没有失去质量的圆圈? (迅速)

时间:2015-11-18 05:13:51

标签: ios swift uiimage

一旦应用roundImage,图像会变得模糊: Making a UIImage to a circle form

extension UIImage
{
    func roundImage() -> UIImage
    {
        let newImage = self.copy() as! UIImage
        let cornerRadius = self.size.height/2
        UIGraphicsBeginImageContextWithOptions(self.size, false, 1.0)
        let bounds = CGRect(origin: CGPointZero, size: self.size)
        UIBezierPath(roundedRect: bounds, cornerRadius: cornerRadius).addClip()
        newImage.drawInRect(bounds)
        let finalImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return finalImage
    }
}

4 个答案:

答案 0 :(得分:2)

尝试这个

让image = UIImageView(frame:CGRectMake(0,0,100,100))

答案 1 :(得分:2)

我建议你可以使用AlamofireImage(https://github.com/Alamofire/AlamofireImage

在不损失质量的情况下制作圆形图像或圆形图像非常容易。

就像这样:

let image = UIImage(named: "unicorn")!
let radius: CGFloat = 20.0

let roundedImage = image.af_imageWithRoundedCornerRadius(radius)
let circularImage = image.af_imageRoundedIntoCircle()

瞧!

答案 2 :(得分:1)

您为什么使用bezierpath?只需为cornerradius设置uiimageview

如果您的图片大于imageview,则必须将image调整为imageview尺寸,然后为cornerradius设置uiimageview

它会起作用。适合我

替换以下行

UIGraphicsBeginImageContextWithOptions(self.size, false, 1.0)

UIGraphicsBeginImageContextWithOptions(self.size, view.opaque , 0.0)

答案 3 :(得分:1)

您的问题是您使用的是规模1,这是最低的质量"。 将比例设置为0将使用设备比例,它只是按原样使用图像。

附注:返回该类的新实例的类中的函数可以实现为类函数。这使得该功能非常清楚。它不会操纵现有图像。它返回一个新的。

由于你在谈论圈子,我也纠正了你的代码,所以它现在会制作一个任意图像的圆圈并裁剪它。你可能想把它放在中心位置。

extension UIImage {

    class func roundImage(image : UIImage) -> UIImage? {

        // copy
        guard let newImage = image.copy() as? UIImage else {
            return nil
        }
        // start context
        UIGraphicsBeginImageContextWithOptions(newImage.size, false, 0.0)

        // bounds
        let cornerRadius = newImage.size.height / 2
        let minDim = min(newImage.size.height, newImage.size.width)
        let bounds = CGRect(origin: CGPointZero, size: CGSize(width: minDim, height: minDim))
        UIBezierPath(roundedRect: bounds, cornerRadius: cornerRadius).addClip()

        // new image
        newImage.drawInRect(bounds)
        let finalImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        // crop
        let maybeCrop = UIImage.crop(finalImage, cropRect: bounds)

        return maybeCrop

    }

    class func crop(image: UIImage, cropRect : CGRect) -> UIImage? {

        guard let imgRef = CGImageCreateWithImageInRect(image.CGImage, cropRect) else {
            return nil
        }
        return UIImage(CGImage: imgRef)
    }
}