Saving UIImage with rounded corners and border with Swift

I use imagePickerController to select an image from a user library. I need to save an image in an application with rounded corners and a border. When I save the image, it saves the unchanged image. I assume that I am only changing the image, not the image itself. Is there a way to save the image as what can be seen in the view?

@IBOutlet var imageViewer: UIImageView!

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
    var imagePicked = info[UIImagePickerControllerOriginalImage] as UIImage
    imageViewer.layer.cornerRadius = 10.0
    imageViewer.clipsToBounds = true
    imageViewer.layer.frame = CGRectInset(imageViewer.layer.frame, 20, 20)
    imageViewer.layer.borderColor = UIColor.purpleColor().CGColor
    imageViewer.layer.borderWidth = 2.0
    imageViewer.image = imagePicked

Thank you for your help!

+4
source share
4 answers

The main operations that must be performed:

  • Lock the drawing area to draw an image without corners.
  • Draw a picture
  • Adjust the color of the stroke, etc.
  • ,

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
      let borderWidth: CGFloat = 2.0
      let imagePicked = info[UIImagePickerControllerOriginalImage] as UIImage
    
      UIGraphicsBeginImageContextWithOptions(imageViewer.frame.size, false, 0)
    
      let path = UIBezierPath(roundedRect: CGRectInset(imageViewer.bounds, borderWidth / 2, borderWidth / 2), cornerRadius: 10.0)
      let context = UIGraphicsGetCurrentContext()
    
      CGContextSaveGState(context)
      // Clip the drawing area to the path
      path.addClip()
    
      // Draw the image into the context
      imagePicked.drawInRect(imageViewer.bounds)
      CGContextRestoreGState(context)
    
      // Configure the stroke
      UIColor.purpleColor().setStroke()
      path.lineWidth = borderWidth
    
      // Stroke the border
      path.stroke()
    
      roundedImage = UIGraphicsGetImageFromCurrentImageContext();
    
      UIGraphicsEndImageContext();
    
      view.addSubview(UIImageView(image: roundedImage))
    
      picker.dismissViewControllerAnimated(true, completion: nil)
    }
    

, , , .

+5

Paul.s (⬆️), UIImage UIImageView, . , , , , , , :

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {

    let imagePicked = info[UIImagePickerControllerOriginalImage] as UIImage

    let borderWidth: CGFloat = 2.0
    let cornerRadius:CGFloat = 10.0

    // Create a multiplier to scale up the corner radius and border
    // width you decided on relative to the imageViewer frame such
    // that the corner radius and border width can be converted to
    // the UIImage scale.
    let multiplier:CGFloat = imagePicked.size.height/imageViewer.frame.size.height > imagePicked.size.width/imageViewer.frame.size.width ?
       imagePicked.size.height/imageViewer.frame.size.height :
       imagePicked.size.width/imageViewer.frame.size.width

    let borderWidthMultiplied:CGFloat = borderWidth * multiplier
    let cornerRadiusMultiplied:CGFloat = cornerRadius * multiplier

    UIGraphicsBeginImageContextWithOptions(imagePicked.size, false, 0)

    let path = UIBezierPath(roundedRect: CGRectInset(CGRectMake(0, 0, imagePicked.size.width, imagePicked.size.height),
       borderWidthMultiplied / 2, borderWidthMultiplied / 2), cornerRadius: cornerRadiusMultiplied)

    let context = UIGraphicsGetCurrentContext()

    CGContextSaveGState(context)
    // Clip the drawing area to the path
    path.addClip()

    // Draw the image into the context
    imagePicked.drawInRect(CGRectMake(0, 0, imagePicked.size.width, imagePicked.size.height))
    CGContextRestoreGState(context)

    // Configure the stroke
    UIColor.blackColor().setStroke()
    path.lineWidth = borderWidthMultiplied

    // Stroke the border
    path.stroke()

    imageViewer.image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    picker.dismissViewControllerAnimated(true, completion: nil)


}
+3

, , - . (. UIGraphicsBeginImageContextWithOptions); (CGContextEOClip); ; , , UIImage (UIGraphicsGetImageFromCurrentImageContext)

0
source

Swift 3:

     func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        if let image = info[UIImagePickerControllerEditedImage] as? UIImage {
            let borderWidth: CGFloat = 2.0
               UIGraphicsBeginImageContextWithOptions(myImageButton.frame.size, false, 0)
                let path = UIBezierPath(roundedRect: myImageButton.bounds.insetBy(dx: borderWidth / 2, dy: borderWidth / 2), cornerRadius: 40.0)
                let context = UIGraphicsGetCurrentContext()
                context!.saveGState()
                path.addClip()
                image.draw(in: myImageButton.bounds)
                UIColor.gray.setStroke()
                path.lineWidth = borderWidth
                path.stroke()
                let roundedImage = UIGraphicsGetImageFromCurrentImageContext()
                UIGraphicsEndImageContext()

                myImageButton.setImage(roundedImage, for: .normal)
}
}
0
source

All Articles