wake-up-neo.net

"Das Erstellen eines Bildformats mit einem unbekannten Typ ist ein Fehler" mit UIImagePickerController

Beim Auswählen eines Bildes aus der Bildauswahl in iOS 10 Swift 3 wird eine Fehlermeldung angezeigt. 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)
}

Das Bild wird nicht ausgewählt und aktualisiert. Ich brauche Hilfe oder einen Vorschlag, um zu erfahren, ob die Syntax oder etwas in Bezug auf diese Methode in iOS10 oder Swift 3 geändert wurde oder ob es eine andere Möglichkeit gibt, dies zu tun.

76
Jeet

Der unten genannte Code hat das Problem für mich gelöst - 

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

Denken Sie daran, einen Delegierten zu sich selbst hinzuzufügen

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

Der folgende Code hat das Problem gelöst: 

Wenn der Benutzer Änderungen an dem ausgewählten Bild vornimmt, wird nur das Bild gezogen. Andernfalls wird die Originalbildquelle ohne Änderungen gezogen und schließlich der Bild-Picker-View-Controller geschlossen. 

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

Wenn Sie die Bearbeitung des Bildes imageController.allowsEditing = true zulassen, müssen Sie zuerst das bearbeitete Bild erhalten:

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

Ich habe festgestellt, dass die Standardbilder in der Fotobibliothek dieses Problem verursachen könnten .. Wenn Sie ein Bild von Ihrem Computer in den Simulator ziehen und es auswählen, wird dieses Problem behoben

5
changmeng chen

Die akzeptierte Lösung von Jeetendra Choudhary funktioniert. Obwohl ich in Xcode 8 mit Swift 3 festgestellt habe, dass eine Warnung ausgegeben wird: Instance method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' nearly matches optional requirement 'imagePickerController(_:didFinishPickingMediaWithInfo:)' of protocol 'UIImagePickerControllerDelegate'

 enter image description here

und schlägt vor, entweder das Schlüsselwort @nonobjc oder private hinzuzufügen, um die Warnung auszuschalten. Wenn Sie die Warnung mit diesen Vorschlägen unterdrücken, funktioniert die Lösung jedoch nicht mehr.

5
Ashildr

Nach der Antwort von Abdurohman ändere ich meinen Code und löse das Problem danke.

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

Fügen Sie dies zu viewDidload () hinzu.

imagepicker.delegate = self
2
Ali Adil

Ich denke, Sie vermissen eine Verbindung zwischen photoImageView und dem Bild.

Sehen Sie sich meine Screenshots unten an:

 enter image description here

 enter image description here

1
My Mai

Das hat für mich funktioniert:

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

Ich denke, Sie vermissen eine Verbindung zwischen photoImageView und dem Bild.

Sehen Sie sich meine Screenshots unten an:

 enter image description here

 enter image description here

Viel Glück!

1
My Mai

didFinishPickingMediaWithInfo info: [String : AnyObject], .__ ändern. zu 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

Für Xcode 8.1 mit Swift 3, Nach dem Ändern der Delegatmethode wie folgt

ändere dein 

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

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

funktion zu

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

    {


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

}

Ich habe vergessen, UINavigationControllerDelegate zusammen mit UIImagePickerControllerDelegate in hinzuzufügen 

class ViewController:UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate

Sie hätten am Anfang eine Variable hinzugefügt 

var imagePicker = UIImagePickerController ()

und Delegieren und Aufrufen einer Funktion in viewdidload () als

 imagePicker.delegate = self
 viwImagePick()

Dann erklären Sie diese Funktion als 

  //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)


        }
    }

Nun wird das Bild aus der Bibliothek zur Bildansicht hinzugefügt

1
Dinesh Kumar

Fügen Sie in Funktionsparametern "_" hinzu.

von

func imagePickerController(picker: UIImagePickerController ...

zu

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

Wenn dies jemandem hilft, hatte ich dies, als ich UIImageView zur Erstellung einer abgerundeten Ansicht subclassierte. Es ist auch passiert, als ich die folgende Zeile in viewDidLoad () hinzugefügt habe.

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

Am Ende fügte ich die Zeile in viewWillLayoutSubViews hinzu und es funktionierte. Weitere Informationen finden Sie hier:

clipsToBounds bewirkt, dass UIImage in iOS10 und XCode 8 nicht angezeigt wird

1
crims345

Das hat bei mir funktioniert. Kopieren Sie es einfach und fügen Sie es genau ein. 

    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

// Bildauswahl mit Sammlungsansicht Klasse 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

Stellen Sie sicher, dass Sie auch den DelegatenUINavigationControllerDelegate angeben. Dies löste das Problem für mich.

0
Jordi Bruin

versuchen Sie es unten

    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

Was ich tat, war, als ich das Bild von didFinishPickingMediaWithInfo bekam, rief ich an:

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
}

um es im NSData-Format zu speichern. 

Die Konsole hat mich immer noch über "[Generic]" gewarnt. Das Erstellen eines Bildformats mit einem unbekannten Typ ist ein Fehler. "Aber zumindest meine imageView wird auf das ausgewählte Bild aktualisiert, anstatt das vorherige von viewDidLoad anzuzeigen.

0
Jackson Gan