«Створення формату зображення з невідомим типом є помилкою» з UIImagePickerController


76

Вибираючи зображення із засобу вибору зображень у 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, чи існує інший спосіб зробити це.


8
Змінити його з AnyObject на AnydidFinishPickingMediaWithInfo info: [String : Any]
Лео Дабус

2
Вам слід просто дозволити Xcode самозавершити його для вас. Метод, яким ви користуєтесь, я вважаю застарілим
Лео Дабус

1
Дякую Лео, справді корисний коментар.
Jeet

5
та сама проблема тут, і String: Будь-яке, здається, не допомагає
TheeBen

1
Все ще не працює. Я використовую версію 8.0 (8A218a)
Kegham K.

Відповіді:


28

Нижче згаданий код вирішив проблему для мене -

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

21
Це не вирішує проблему для мене. Я оновив функцію і все одно отримую повідомлення про помилку відразу при виклику цієї функції. І використання UIImage після цього не працює.
Тім

3
@Tim Я все ще отримую помилку, але доступ до зображення працює нормально.
MobileVet

1
@jeetendra Це вирішує мою проблему, але все одно дає мені попередження "Метод екземпляра (didFinishPickingMediaWithInfo) майже відповідає своїй необов'язковій вимозі." Коли я додаю private або nonobj перед функцією, тоді попередження зникає, але метод не викликається.
Arpit Dhamane

Це рішення не працює для мене на XCode 8 та Swift 3. Я використовую пристрій iOS10.
Machado

1
Незважаючи на те, що це допомогло мені вирішити проблему з тим, що зображення не відображається, помилка все ще відображається в консолі. Хоча дякую.
Арджун Калідас,

11

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

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

Ха, ти врятував мене. Xcode 7 компілювався б і працював належним чином без призначення делегатів ... божевільно.
MobileVet

10

Нижче код вирішив проблему:

Якщо користувач виконує зміни у вибраному зображенні, витягніть лише це зображення, інакше витягніть оригінальне джерело зображення без будь-яких змін і, нарешті, відхиліть контролер перегляду вибору зображень.

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

2
Ласкаво просимо до Stack Overflow! Відповіді лише на код не дуже корисні самі по собі. Було б корисно, якщо б ви могли додати якусь детальну інформацію, яка б пояснила, як / чому це відповідає на запитання
Jeet

Це повинна бути правильна відповідь. Працює бездоганно.
user3286381 02

7

Якщо ви дозволяєте редагувати зображення, 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
    }
}

Я реалізував вашу відповідь, але все ще отримую помилку. Чи не могли б ви , будь ласка , прочитайте моє запитання stackoverflow.com/questions/50189732
bibscy

5

Прийняте рішення по джеетендре Чудхарі works.Although в Xcode 8 з Swift 3, я помітив , що вона генерує попередження: Instance method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' nearly matches optional requirement 'imagePickerController(_:didFinishPickingMediaWithInfo:)' of protocol 'UIImagePickerControllerDelegate'

введіть тут опис зображення

і пропонує додати або @nonobjc, або приватне ключове слово, щоб заглушити попередження. Якщо ви замовчуєте попередження за допомогою цих пропозицій, рішення вже не працює.


Дякую за роз'яснення, має сенс.
Джит

1
Проблема полягає в "AnyObject" - правильний підпис Swift 3 використовує "Any". Не використовуйте запропоновані Xcode рішення для мовчання попередження.
Зіг

5

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


3

Відповідно до відповіді Абдурохмана, я міняю свій код і вирішую проблему, дякую.

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

Це єдиний код, який працював у мене в Swift 3.0. Дякую!
fraxool


1

Додайте "_" у параметри функції.

від

func imagePickerController(picker: UIImagePickerController ...

до

func imagePickerController(_ picker: UIImagePickerController ...

1

Це спрацювало для мене:

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

Ласкаво просимо до Stack Overflow! Відповіді лише на код не дуже корисні самі по собі. Було б корисно, якщо б ви могли додати якусь детальну інформацію, яка пояснює, як / чому це відповідає на запитання
Jeet

1

Якщо це комусь допомагає, у мене це сталося, коли я підкласифікував UIImageView, щоб створити округлений вигляд. Це також сталося, коли я додав нижній рядок у viewDidLoad ()

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

У підсумку я додав рядок у viewWillLayoutSubViews, і це спрацювало. Докладніше див. Це:

clipsToBounds призводить до того, що UIImage не відображається в iOS10 і XCode 8


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

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

4
Ласкаво просимо до Stack Overflow! Відповіді лише на код не дуже корисні самі по собі. Було б корисно, якщо б ви могли додати детальну інформацію, яка пояснює, як / чому це відповідає на запитання.
SiHa

2
Це вирішило мою проблему. Але чи можете ви пояснити причину?
Krishnadas PC

1

Змінити didFinishPickingMediaWithInfo info: [String : AnyObject], наdidFinishPickingMediaWithInfo info: [String : Any]


1

Для Xcode 8.1 зі швидким 3, Після зміни методу делегування, як показано нижче

змінити свій

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

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

функція до

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

    {


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

}

Я забув додати UINavigationControllerDelegate разом з UIImagePickerControllerDelegate в

class ViewController:UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate

Ви б додали змінну на початку, як

var imagePicker = UIImagePickerController ()

і встановити делегат і викликати функцію в viewdidload () як

 imagePicker.delegate = self
 viwImagePick()

Потім поясніть цю функцію як

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


        }
    }

Тепер зображення додається до перегляду зображень із бібліотеки


Будь ласка, відредагуйте відповідь, щоб пояснити, як це пов’язано з актуальним питанням. З вашого пояснення це не зовсім зрозуміло.
Джит

1

Думаю, у вас відсутній зв’язок між photoImageView та зображенням.

Погляньте мої знімки екрана нижче:

введіть тут опис зображення

введіть тут опис зображення


Чому 2 відповіді з однаковим змістом?
वн

1

Думаю, у вас відсутній зв’язок між photoImageView та зображенням.

Погляньте мої знімки екрана нижче:

введіть тут опис зображення

введіть тут опис зображення

Удачі!


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

}

0

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


0

спробуйте нижче

    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

Це спрацювало для мене. Просто скопіюйте та вставте його точно.

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

5
Ласкаво просимо до Stack Overflow! Відповіді лише на код не дуже корисні самі по собі. Було б корисно, якщо б ви могли додати детальну інформацію, яка пояснює, як / чому це відповідає на запитання
Джит

0

Що я зробив, це те, що як тільки я отримав зображення від 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.

Консоль все одно попереджала мене про "[Загальне] Створення формату зображення з невідомим типом є помилкою", але принаймні мій imageView оновлюється до вибраного зображення, а не показує попередній із viewDidLoad.


0

// засіб вибору зображень із класом подання колекції 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



}

-1

Для мене я отримував помилку:

"фатальна помилка: несподівано знайдено нуль ..."

коли ви вибираєте imagein imagepicker.

Щоб обійти проблему, я знову створив торгову точку для imageView.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.