将图像裁剪为圆形Swift 3。

4

我有一个问题,已经在过去几天里一直在尝试解决,但是无法找到解决方法。我的问题非常简单,我正在尝试裁剪一张图片,使其变成圆形。通过已完成的研究,我发现可以使用几种方法来实现这一点,其中主要的方法似乎是简单地裁剪UIImageView,以使其成为圆形边框。下面是我用来做到这一点的代码:

imageView.layer.masksToBounds = false
imageView.layer.cornerRadius = imageView.frame.height/2
imageView.clipsToBounds = true

唯一的问题是,这种方法只能裁剪图像视图的框架而不是图像本身。因此,如果我将图像保存到用户的相机胶卷中,它仍然会显示为矩形而不是裁剪后的圆形。我有些困惑该如何实现这一点,因为我在Xcode上还比较新,并希望有人能够提供一种方法来裁剪图像本身而不仅仅是框架。非常感谢任何关于这个主题的帮助。谢谢。


imageView 的内容视图是什么?另外,请添加一张您的图片外观截图。 - Sneha
我认为你应该为图层设置边框半径颜色和边框宽度 :) - Abu Ul Hassan
可能是Circular cropping Swift 3的重复问题。 - matt
不要重复你自己的问题。如果你在原来的问题中没有得到合适的答案,请编辑它。 - matt
嗨,这并不是一个重复的问题,它是一个非常相似的问题,但如果你仔细看,你会发现它们是不同的。这个问题是关于修改照片本身,而上一个问题是关于图像视图内部图像的方面以及裁剪图像视图。 - imjonu
3个回答

8

尝试这个适用于 Swift 3 的代码,首先您需要将imageView的内容模式设置为Aspect Fit。

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var imgView: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()
    let profilePicture = UIImage(named: "yourImageName")
    self.imgView.image = profilePicture.circleMasked
   }

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}



}

  extension UIImage {
  var isPortrait:  Bool    { return size.height > size.width }
  var isLandscape: Bool    { return size.width > size.height }
  var breadth:     CGFloat { return min(size.width, size.height) }
  var breadthSize: CGSize  { return CGSize(width: breadth, height: breadth) }
  var breadthRect: CGRect  { return CGRect(origin: .zero, size: breadthSize) }
  var circleMasked: UIImage? {
      UIGraphicsBeginImageContextWithOptions(breadthSize, false, scale)
      defer { UIGraphicsEndImageContext() }
      guard let cgImage = cgImage?.cropping(to: CGRect(origin: CGPoint(x: isLandscape ? floor((size.width - size.height) / 2) : 0, y: isPortrait  ? floor((size.height - size.width) / 2) : 0), size: breadthSize)) else { return nil }
      UIBezierPath(ovalIn: breadthRect).addClip()
      UIImage(cgImage: cgImage, scale: 1, orientation: imageOrientation).draw(in: breadthRect)
      return UIGraphicsGetImageFromCurrentImageContext()
  }
}

4
尝试以下的方法,同时确保高度和宽度大小相同,否则会呈现为椭圆形或结果不符合要求。
imageView.layer.masksToBounds = false
imageView.layer.cornerRadius = imageView.frame.height/2
imageView.layer.borderWidth = 1
imageVoew.layer.borderColor = UIColor.clear.cgColor
imageView.clipsToBounds = true

3
UIImageView 的更改只会影响图像在用户界面上的展示方式,不会实际更改底层的图像对象。 - Dávid Pásztor

4
让我们开始介绍**图形上下文**。

enter image description here

func makeRoundImg(img: UIImageView) -> UIImage {
    let imgLayer = CALayer()
    imgLayer.frame = img.bounds
    imgLayer.contents = img.image?.cgImage;
    imgLayer.masksToBounds = true;

    imgLayer.cornerRadius = 28 //img.frame.size.width/2

    UIGraphicsBeginImageContext(img.bounds.size)
    imgLayer.render(in: UIGraphicsGetCurrentContext()!)
    let roundedImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return roundedImage!;
}

1
在Swift中,除非您在单行中有多个表达式,否则不应使用分号。 - Dávid Pásztor
1
最近开始从ObjC应用Swift。下次我会一直注意的,谢谢 :) :) - user3693546

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接