"Создание формата изображения с неизвестным типом является ошибкой" с помощью UIImagePickerController


при выборе изображения из средства выбора изображений в iOS 10 Swift 3 я получаю сообщение об ошибке -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)
}

изображение не выбирается и не обновляется. Мне нужна помощь или предложение, чтобы узнать, был ли изменен синтаксис или что-либо в отношении этого метода в iOS10 или Swift 3 или есть ли другой способ сделать это.

23 76

23 ответа:

ниже упомянутый код действительно решить эту проблему для меня -

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

Не забудьте добавить делегат в self

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

ниже код действительно решить эту проблему:

если пользователь выполняет изменения в выбранном изображении, потяните только это изображение, иначе потяните исходный источник изображения без каких-либо изменений и, наконец, отключите контроллер вида выбора изображений.

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

Если вы разрешите редактирование изображения imageController.allowsEditing = true тогда вам нужно будет сначала получить отредактированное изображение:

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
    }
}

на принято решение by Чудхари Jeetendra строительство.Хотя в Xcode 8 С Swift 3 я заметил , что он генерирует предупреждение : Instance method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' nearly matches optional requirement 'imagePickerController(_:didFinishPickingMediaWithInfo:)' of protocol 'UIImagePickerControllerDelegate'

enter image description here

и предлагает добавить @nonobjc или частная ключевое слово, чтобы отключить предупреждение.Если вы отключите предупреждение, используя эти предложения, решение больше не работает.

Я обнаружил, что изображения по умолчанию в библиотеке фотографий могут решить эту проблему. Если вы перетащите изображение с Вашего компьютера на симулятор и выберите его. эта проблема решена

согласно ответа Abdurohman, я изменить мой код и решить проблему,спасибо.

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

добавьте это в viewDidload ()

imagepicker.delegate = self

добавить " _ " в параметры функции.

С

func imagePickerController(picker: UIImagePickerController ...

до

func imagePickerController(_ picker: UIImagePickerController ...

это сработало для меня:

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

Если это кому-то поможет, у меня это произошло, когда я подкласс UIImageView для создания округленного вида. Это также произошло, когда я добавил строку ниже в viewDidLoad ()

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

Я закончил тем, что добавил строку в viewWillLayoutSubViews, и это сработало. Посмотреть подробнее:

clipsToBounds вызывает объектами UIImage, чтобы не отображать в iOS10 & Xcode версии 8

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

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

изменить didFinishPickingMediaWithInfo info: [String : AnyObject] , к didFinishPickingMediaWithInfo info: [String : Any]

для Xcode 8.1 с swift 3, после изменения метода делегата, как показано ниже

изменить

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

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

Я думаю, что вам не хватает связи между photoImageView и изображением.

посмотрите мои скриншоты ниже:

enter image description here

enter image description here

Я думаю, что вам не хватает связи между photoImageView и изображением.

посмотрите мои скриншоты ниже:

enter image description here

enter image description here

удачи!

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)

}

Не забудьте также включитьUINavigationControllerDelegate делегат. Это решило проблему для меня.

попробовать ниже

    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
}

это сработало для меня. Просто скопируйте и вставьте его точно.

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

что я сделал, так это то, что как только я получил изображение от didFinishPickingMediaWithInfo, я позвонил:

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
}

чтобы сохранить его в формате NSData.

консоль все еще предупреждала меня о том, что "[Generic] создание формата изображения с неизвестным типом является ошибкой", но по крайней мере мой imageView обновляется до выбранного изображения, а не показывает предыдущий из viewDidLoad.

/ / средство выбора изображений с видом коллекции класс 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



}

для меня, я получаю ошибку:

"фатальная ошибка: неожиданно обнаружил Нил..."

когда вы выбираете изображение в посте imagepicker.

чтобы обойти проблему, я создал выход для imageView снова.