"Créer un format d'image avec un type inconnu est une erreur" avec UIImagePickerController

En choisissant une image du sélecteur d'image dans iOS 10 Swift 3 je reçois une erreur – Creating an image format with an unknown type is an error

  func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [Ssortingng : AnyObject]?) { imagePost.image = image self.dismiss(animated: true, completion: nil) } 

L'image n'est pas sélectionnée et mise à jour. J'ai besoin d'aide ou de suggestion pour savoir si la syntaxe ou quoi que ce soit concernant cette méthode a été modifiée dans iOS10 ou Swift 3 ou s'il existe un autre moyen de le faire.

Le code mentionné ci-dessous a résolu le problème pour moi –

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [Ssortingng : AnyObject]) { if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { imagePost.image = image } else{ print("Something went wrong") } self.dismiss(animated: true, completion: nil) } 

N'oubliez pas d'append un délégué à soi-même

 let picker = UIImagePickerController() picker.delegate = self // delegate added 

Le code ci-dessous a résolu le problème:

Si l'user effectue des modifications sur l'image sélectionnée, ne tirez que sur cette image. Dans le cas contraire, retirez la source d'image originale sans la moindre modification, puis fermez le controller de vue du sélecteur d'images.

 public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [Ssortingng : Any]){ if let image = info[UIImagePickerControllerEditedImage] as? UIImage { imageView.image = image } else if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { imageView.image = image } else{ print("Something went wrong") } self.dismiss(animated: true, completion: nil) } 

Si vous autorisez la modification de l'image imageController.allowsEditing = true vous devez d'abord get l'image modifiée:

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [Ssortingng : AnyObject]) { picker.dismissViewControllerAnimated(true, completion: nil) if let image = info[UIImagePickerControllerEditedImage] as? UIImage { imagePost.image = image } else if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { imagePost.image = image } else { imagePost.image = nil } } 

La solution acceptée par Jeetendra Choudhary fonctionne.Bien que dans Xcode 8 avec Swift 3, j'ai remarqué qu'il génère un avertissement: Instance method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' nearly matches optional requirement 'imagePickerController(_:didFinishPickingMediaWithInfo:)' of protocol 'UIImagePickerControllerDelegate'

entrez la description de l'image ici

et suggère d'append soit @nonobjc soit un mot-key privé pour faire taire l'avertissement. Si vous désactivez l'avertissement en utilisant ces suggestions, la solution ne fonctionne plus.

J'ai trouvé les images par défaut dans la photothèque pourrait résoudre ce problème. Si vous faites glisser une image de votre ordinateur sur le simulateur et choisissez-la. ce problème est résolu

Selon la réponse d'Abdurohman, je change mon code et résous le problème, merci.

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [Ssortingng : Any]) { let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage photoImageView.image = selectedImage // Dismiss the picker. dismiss(animated: true, completion: nil) } 

Ajoutez ceci à viewDidload ()

 imagepicker.delegate = self 

Ajouter "_" dans les parameters de la fonction.

de

 func imagePickerController(picker: UIImagePickerController ... 

à

 func imagePickerController(_ picker: UIImagePickerController ... 

Cela a fonctionné pour moi:

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [Ssortingng : Any]) { if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { imageView.image = image self.dismiss(animated: true, completion: nil) } } 

Si cela aide quelqu'un, je l'ai fait quand j'ai sous-classé UIImageView pour créer une vue arrondie. Il est également arrivé lorsque j'ai ajouté la ligne ci-dessous dans viewDidLoad ()

 imageView.layer.cornerRadius = self.imageView.frame.size.width / 2 

J'ai fini par append la ligne dans viewWillLayoutSubViews et cela a fonctionné. Voir ceci pour plus de détails:

clipsToBounds provoque UIImage à ne pas afficher dans iOS10 et XCode 8

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [Ssortingng : Any]) { let image = info[UIImagePickerControllerOriginalImage] as? UIImage self.dismiss(animated: true, completion: nil) self.imageTook.image = image } 

Modifiez didFinishPickingMediaWithInfo info: [Ssortingng : AnyObject] , à didFinishPickingMediaWithInfo info: [Ssortingng : Any]

Pour Xcode 8.1 avec swift 3, Après avoir changé la méthode de délégation comme ci-dessous

change ton

 func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [Ssortingng : AnyObject]?) { imagePost.image = image self.dismiss(animated: true, completion: nil) } 

fonction à

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [Ssortingng : Any]) { imagePost.image = info[UIImagePickerControllerOriginalImage] as? UIImage picker.dismiss(animated: true, completion: nil) } 

J'ai oublié d'append UINavigationControllerDelegate avec UIImagePickerControllerDelegate dans

 class ViewController:UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate 

Vous auriez ajouté une variable au début comme

var imagePicker = UIImagePickerController ()

et définir déléguer et appeler une fonction dans viewdidload () comme

  imagePicker.delegate = self viwImagePick() 

Ensuite, expliquez cette fonction

  //ImagePicker func viwImagePick(){ let alert = UIAlertController(title: nil, message: "Choose your source", preferredStyle: UIAlertControllerStyle.alert) alert.addAction(UIAlertAction(title: "Camera", style: UIAlertActionStyle.default) { (result : UIAlertAction) -> Void in print("Camera selected") self.openCamera() //Code for Camera //cameraf }) alert.addAction(UIAlertAction(title: "Photo library", style: UIAlertActionStyle.default) { (result : UIAlertAction) -> Void in print("Photo selected") self.openGallary() //Code for Photo library //photolibaryss }) self.present(alert, animated: true, completion: nil) } func openCamera() { imagePicker.sourceType = UIImagePickerControllerSourceType.camera if UIDevice.current.userInterfaceIdiom == .phone { self.present(imagePicker, animated: true, completion: nil) } else { let popover = UIPopoverController(contentViewController: imagePicker) popover.present(from: profileImgViw.frame, in: self.view, permittedArrowDirections: UIPopoverArrowDirection.any, animated: true) } } func openGallary() { imagePicker.sourceType = UIImagePickerControllerSourceType.savedPhotosAlbum if UIDevice.current.userInterfaceIdiom == .phone { self.present(imagePicker, animated: true, completion: nil) } else { let popover = UIPopoverController(contentViewController: imagePicker) popover.present(from: profileImgViw.frame, in: self.view, permittedArrowDirections: UIPopoverArrowDirection.any, animated: true) } } 

Maintenant, l'image est ajoutée à la vue de l'image de la bibliothèque

Je pense qu'il vous manque un lien entre photoImageView et l'image.

Jetez un oeil mes captures d'écran ci-dessous:

entrez la description de l'image ici

entrez la description de l'image ici

Bonne chance!

Veillez également à inclure le délégué UINavigationControllerDelegate . Cela a résolu le problème pour moi.

essayer ci-dessous

  func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [Ssortingng : Any]) { print("image selected"); let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImag self.dismiss(animated: true, completion: nil) UIImg.image = selectedImage } 

Cela a fonctionné pour moi. Copiez-le et collez-le exactement.

  func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [Ssortingng : Any]) { // The info dictionary contains multiple representations of the image, and this uses the original. let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage // Set photoImageView to display the selected image. photoImageView.image = selectedImage // Dismiss the picker. dismiss(animated: true, completion: nil) } 

Ce que j'ai fait, c'est qu'une fois que j'ai obtenu l'image de didFinishPickingMediaWithInfo, j'ai appelé:

 func prepareImageForSaving(image:UIImage) { // create NSData from UIImage guard let imageData = UIImageJPEGRepresentation(image, 1) else { // handle failed conversion print("jpg error") return } self.saveImage(imageData: imageData as NSData) } func saveImage(imageData: NSData) { imageDatas = imageData } 

pour l'save au format NSData.

La console m'avait encore averti que "[Générique] Créer un format d'image avec un type inconnu est une erreur" mais au less mon imageView est mise à jour pour l'image sélectionnée plutôt que d'afficher la précédente de viewDidLoad.

Je pense qu'il vous manque un lien entre photoImageView et l'image.

Jetez un oeil mes captures d'écran ci-dessous:

entrez la description de l'image ici

entrez la description de l'image ici

// sélecteur d'image avec la class de vue de collection ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UICollectionViewDataSource, UICollectionViewDelegate {

 @IBOutlet var img: UIImageView! @IBOutlet weak var collview: UICollectionView! var image = NSMutableArray() let imgpkr = UIImagePickerController() override func viewDidLoad() { super.viewDidLoad() imgpkr.delegate = self } @IBAction func btnselect(_ sender: UIButton) { imgpkr.allowsEditing = true // false imgpkr.sourceType = .photoLibrary imgpkr.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)! present(imgpkr, animated: true, completion: nil) } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [Ssortingng : Any]) { let choose = info[UIImagePickerControllerOriginalImage]as!UIImage let edit = info[UIImagePickerControllerEditedImage]as!UIImage img.contentMode = .scaleAspectFit img.image = edit //MARK:- Add image in collview image.add(edit) collview.reloadData() dismiss(animated: true, completion: nil) } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { dismiss(animated: true, completion: nil) } //MARK:- Collection View func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return image.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collview.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)as! CollectionViewCell1 cell.img1.image = image.object(at: indexPath.item)as! UIImage return cell }