Swift3 裁剪图像为圆形swift 3

Swift3 裁剪图像为圆形swift 3,swift3,uiimageview,drawing,crop,Swift3,Uiimageview,Drawing,Crop,所以我有这个问题,我在过去的几天里一直在努力解决,但却找不到解决问题的办法。我的问题很简单,我试图裁剪一个图像,使其成为一个圆。从所做的研究中,我发现了一些可以用来实现这一点的方法,其中最主要的一种方法是简单地裁剪UIImageView,使其成为一个圆形框架。下面是我用来做这件事的代码 imageView.layer.masksToBounds = false imageView.layer.cornerRadius = imageView.frame.height/2 imageView.cl

所以我有这个问题,我在过去的几天里一直在努力解决,但却找不到解决问题的办法。我的问题很简单,我试图裁剪一个图像,使其成为一个圆。从所做的研究中,我发现了一些可以用来实现这一点的方法,其中最主要的一种方法是简单地裁剪UIImageView,使其成为一个圆形框架。下面是我用来做这件事的代码

imageView.layer.masksToBounds = false
imageView.layer.cornerRadius = imageView.frame.height/2
imageView.clipsToBounds = true
唯一的问题是,这种方法只裁剪图像视图的框架,而不是图像本身。因此,如果我将图像保存到用户的相机卷,例如,它仍然会显示为一个矩形,而不是一个裁剪的圆。我对如何真正做到这一点有些迷茫,因为我对Xcode比较陌生,希望有人能提供一种方法,让我能够裁剪图像本身,而不仅仅是帧。在此主题上的任何帮助都将不胜感激。谢谢。

试试下面的内容

imageView.layer.masksToBounds = false
imageView.layer.cornerRadius = imageView.frame.height/2
imageView.layer.borderWidth = 1
imageVoew.layer.borderColor = UIColor.clear.cgColor
imageView.clipsToBounds = true

让我们进入**图形上下文 **.


请为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()
  }
}

imageView的内容视图是什么?另外,请添加一张图片的截图。我认为您应该为图层设置边框半径颜色和边框宽度:)可能重复的请勿重复您自己的问题。如果你的原始问题没有得到像样的答案,请编辑它。嗨,这实际上不是一个重复的问题。这是一个非常相似的问题,但如果你仔细观察,你会发现它们是不同的。这是关于更改照片本身,而最后一个问题是关于图像视图中图像的外观以及裁剪图像视图。除非在一行中有多个表达式,否则不应在Swift中使用分号。最近从objC开始使用Swift。我会从下次开始一直照顾它。。谢谢:):)对
UIImageView
的更改只会更改图像在UI上的显示方式,实际上不会更改基础图像对象。
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()
  }
}