web-dev-qa-db-fra.com

"La création d'un format d'image avec un type inconnu est une erreur" avec UIImagePickerController

Tout en choisissant une image dans le sélecteur d’images sous 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: [String : AnyObject]?) {

    imagePost.image = image
    self.dismiss(animated: true, completion: nil)
}

L'image n'est pas sélectionnée ni 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é dans iOS10 ou Swift 3 ou s'il existe un autre moyen de le faire.

76
Jeet

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

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

    self.dismiss(animated: true, completion: nil)
}
28
Jeet

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

let picker = UIImagePickerController()
picker.delegate = self // delegate added
11
Roberto Gutierrez

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

Si l'utilisateur apporte des modifications à l'image sélectionnée, n'extrayez que cette image, sinon extrayez la source de l'image d'origine sans aucune modification et fermez enfin le contrôleur de vue du sélecteur d'images. 

public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : 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)
}
10
keerthi chinivar

Si vous autorisez l'édition de l'image imageController.allowsEditing = true, vous devez d'abord obtenir l'image modifiée:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : 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
    }
}
7
oyalhi

J'ai trouvé que les images par défaut de la photothèque pouvaient être à l'origine de ce problème ... Si vous faites glisser une image de votre ordinateur sur le simulateur et que vous la choisissez .. ce problème est résolu

5
changmeng chen

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

 enter image description here

et suggère d'ajouter le mot clé @nonobjc ou private pour faire taire l'avertissement.Si vous faites taire l'avertissement à l'aide de ces suggestions, la solution ne fonctionne plus.

5
Ashildr

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

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage

    photoImageView.image = selectedImage

    // Dismiss the picker.
    dismiss(animated: true, completion: nil)
}
3
edenPan

Ajoutez ceci à viewDidload ()

imagepicker.delegate = self
2
Ali Adil

Je pense qu'il vous manque une connexion entre photoImageView et l'image.

Jetez un coup d'œil à mes captures d'écran ci-dessous:

 enter image description here

 enter image description here

1
My Mai

Cela a fonctionné pour moi:

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

Je pense qu'il vous manque une connexion entre photoImageView et l'image.

Jetez un coup d'œil à mes captures d'écran ci-dessous:

 enter image description here

 enter image description here

Bonne chance!

1
My Mai

Changez didFinishPickingMediaWithInfo info: [String : AnyObject], à didFinishPickingMediaWithInfo info: [String : Any]

1
evan
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        imgViewPhoto.image = image
    } else{
        print("Something went wrong")
    }

    picker.dismiss(animated: true, completion: nil)

}
1
DMP_2016
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

         let image = info[UIImagePickerControllerOriginalImage] as? UIImage
        self.dismiss(animated: true, completion: nil)
        self.imageTook.image = image
    }
1
Ramanaraynan

Pour Xcode 8.1 avec Swift 3, après avoir modifié la méthode de délégation comme indiqué ci-dessous

change ton 

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {

    imagePost.image = image
    self.dismiss(animated: true, completion: nil)
}

fonction à

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])

    {


imagePost.image = info[UIImagePickerControllerOriginalImage] as? UIImage
 picker.dismiss(animated: true, completion: nil)

}

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

class ViewController:UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate

Vous auriez ajouté une variable au début comme 

var imagePicker = UIImagePickerController ()

et paramétrer délégué et appeler une fonction dans viewdidload () en tant que

 imagePicker.delegate = self
 viwImagePick()

Puis expliquer cette fonction en tant que 

  //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 à partir de la bibliothèque

1
Dinesh Kumar

Ajouter "_" dans les paramètres de la fonction.

de

func imagePickerController(picker: UIImagePickerController ...

à

func imagePickerController(_ picker: UIImagePickerController ...
1
Woongbi Kim

Si cela peut aider quelqu'un, c'est ce qui s'est passé lorsque j'ai sous-classé UIImageView pour créer une vue arrondie. C'est également arrivé quand j'ai ajouté la ligne ci-dessous dans viewDidLoad ()

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

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

clipsToBounds empêche UIImage de s'afficher dans iOS10 et XCode 8

1
crims345

Cela a fonctionné pour moi. Il suffit de copier et coller exactement. 

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : 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)
}
0
thepiranha

// sélecteur d'images avec vue de collection class 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: [String : 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



}
0
hiren

Assurez-vous d'inclure également le délégué UINavigationControllerDelegate. Cela a résolu le problème pour moi.

0
Jordi Bruin

essayez ci-dessous

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

Ce que j'ai fait, c'est qu'une fois l'image de didFinishPickingMediaWithInfo reçue, 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'enregistrer au format NSData. 

La console m'a quand même averti sur "[Générique] La création d'un format d'image avec un type inconnu est une erreur" mais au moins, mon imageView est mis à jour pour l'image sélectionnée au lieu d'afficher la précédente de viewDidLoad.

0
Jackson Gan