swiftxcodephassetphotosframework

Modify/Edit PhAsset Image by Cropping


is there any way to modify/edit phasset image by cropping or edited one? I have array of asset, I wanna crop image of asset by getting image from selected asset and passing it cropping controller and in return want to change that cropped image in selected asset.

There is my code to understand well

func presentCropViewController(with:IndexPath) {
    self.allPhotos[with.item].getImage { (img) in
        if let image = img{
              self.indexPathForCropping = with
            let cropViewController = CropViewController(image: image)
            cropViewController.delegate = self
            cropViewController.view.tintColor = UIColor.themeGreen()
            self.present(cropViewController, animated: true, completion: nil)

        }
    }


}

after passing image from asset I got cropped image with this method

 func cropViewController(_ cropViewController: CropViewController, didCropToImage image: UIImage, withRect cropRect: CGRect, angle: Int) {
    cropViewController.dismiss(animated: true, completion: nil)
    // Here i get the cropped image and want to update selected asset with this image

}

I'll appreciate if you mentioned down vote reason too so I prepare my question accordinglly


Solution

  • I figured out the solution may its not an efficient way to do but solved my problem

    extension PHAsset {
    
    func updateChanges(with img:UIImage,completion:@escaping(PHAsset?)->()){
    
        PHPhotoLibrary.shared().performChanges({
            // create cropped image into phphotolibrary
            PHAssetChangeRequest.creationRequestForAsset(from: img)
        }) { (success, error) in
            if success{
                // fetch request to get last created asset
                let fetchOptions = PHFetchOptions()
                fetchOptions.sortDescriptors = [NSSortDescriptor(key:"creationDate", ascending: false)]
                fetchOptions.fetchLimit = 1
                let fetchResult: PHFetchResult = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: fetchOptions)
    
                if let asset = fetchResult.firstObject{
                    // replace your selected asset with new cropped one
                    completion(asset)
                }else{
                    completion(nil)
                }
    
            }else{
                completion(nil)
            }
        }
    
    }
    

    }

    simply pass cropped/modified image and get new asset with same cropped/modified image