Search code examples
iosswiftimagecocoa-touchuiimagepickercontroller

iOS, Swift, UIImagePicker allows editing crop tool removes transparency. Is there fix?


When I get PNG image with transparent background from UIImagePicker it inserts the image with the transparent background just fine as below:

enter image description here

when I set:

imagePicker.allowsEditing = true

it allows me to crop as expected in the view provided by UIImagePicker

but then when I press 'Choose' it returns the image with black instead of a transparent background as below:

enter image description here

The only change between the two results is setting

imagePicker.allowsEditing = true

and cropping the image in the app.

Is there a way to keep transparency or at least change the black to white when cropping?

I have searched the internet and no mention of this that I can see.

Code:

 func showImagePicker() {
    imagePicker.allowsEditing = true
    imagePicker.sourceType = .photoLibrary

    present(imagePicker, animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let pickedImage = info[UIImagePickerControllerEditedImage] as? UIImage {
        compImageView?.contentMode = .scaleAspectFit
        compImageView?.backgroundColor = UIColor.clear
        compImageView?.image = pickedImage

    }

    dismiss(animated: true, completion: nil)
}

Solution

  • By default UIImagePickerController removes the alpha channels in the edited image. To get that transparency you have to edit image yourself. Implement delegate method like this:

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    
    
            if let cropRect = info[UIImagePickerControllerCropRect] as? CGRect {
                if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
                    let imageRef: CGImage = image.cgImage!.cropping(to: cropRect)!
    
                    let image1: UIImage = UIImage(cgImage: imageRef, scale: image.scale, orientation: image.imageOrientation)
    
                    imageView.image = image1
                    picker.dismiss(animated: true, completion: nil)
    
                }
    
            }
    
        }