“Tạo định dạng hình ảnh với loại không xác định là một lỗi” với UIImagePickerController


76

Trong khi chọn hình ảnh từ trình chọn hình ảnh trong iOS 10 Swift 3, tôi gặp lỗi - 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)
}

Hình ảnh không được chọn và cập nhật. Tôi cần trợ giúp hoặc gợi ý để biết liệu cú pháp hoặc bất kỳ điều gì liên quan đến phương pháp này đã được thay đổi trong iOS10 hoặc Swift 3 hay có cách nào khác để thực hiện việc này hay không.


8
Thay đổi nó từ AnyObject thành AnydidFinishPickingMediaWithInfo info: [String : Any]
Leo Dabus

2
Bạn chỉ nên để Xcode tự động hoàn thành nó cho bạn. Các phương pháp bạn đang sử dụng Tôi nghĩ bị phản đối
Leo Dabus

1
Cảm ơn Leo thực sự là một bình luận hữu ích.
Jeet

5
cùng một vấn đề ở đây và Chuỗi: Bất kỳ dường như không giúp được gì
TheeBen

1
Vẫn không làm việc . Tôi đang sử dụng Phiên bản 8.0 (8A218a)
Kegham K.

Câu trả lời:


28

Mã được đề cập bên dưới đã giải quyết vấn đề cho tôi -

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
Điều này không giải quyết được vấn đề cho tôi. Tôi đã cập nhật chức năng và vẫn nhận được thông báo lỗi ngay lập tức khi chức năng này được gọi. Và việc sử dụng UIImage không hoạt động sau đó.
Tim

3
@Tim Tôi vẫn gặp lỗi, nhưng truy cập hình ảnh hoạt động tốt.
MobileVet

1
@jeetendra Điều này giải quyết được vấn đề của tôi, nhưng nó vẫn đưa ra cảnh báo cho tôi "Phương thức phiên bản (didFinishPickingMediaWithInfo) gần như khớp với yêu cầu tùy chọn của nó." Khi tôi thêm private hoặc nonobj cho func, thì cảnh báo sẽ biến mất nhưng phương thức không được gọi.
Arpit Dhamane

Giải pháp này không hoạt động với tôi trên XCode 8 và Swift 3. Tôi đang sử dụng thiết bị iOS10.
Machado

1
Mặc dù điều này đã giúp tôi giải quyết vấn đề hình ảnh không xuất hiện, nhưng lỗi vẫn xuất hiện trong bảng điều khiển. Xin cảm ơn.
Arjun Kalidas

11

Hãy nhớ thêm đại diện cho chính mình

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

Ha, bạn đã cứu tôi. Xcode 7 sẽ biên dịch và hoạt động bình thường mà không có sự phân công ủy quyền ... thật điên rồ.
MobileVet

10

Mã dưới đây đã giải quyết vấn đề:

Nếu người dùng thực hiện các thay đổi đối với hình ảnh đã chọn, chỉ kéo hình ảnh đó nếu không thì kéo nguồn hình ảnh gốc mà không có bất kỳ thay đổi nào và cuối cùng loại bỏ bộ điều khiển chế độ xem bộ chọn hình ảnh.

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
Chào mừng bạn đến với Stack Overflow! Các câu trả lời chỉ có mã không hữu ích cho chính chúng. Nó sẽ giúp đỡ nếu bạn có thể thêm một số chi tiết giải thích như thế nào / tại sao nó trả lời câu hỏi
Jeet

Đây phải là câu trả lời chính xác. Hoạt động hoàn hảo.
user3286381

7

Nếu bạn cho phép chỉnh sửa ảnh imageController.allowsEditing = truethì trước tiên bạn sẽ cần lấy ảnh đã chỉnh sửa:

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

Tôi đã triển khai phản hồi của bạn, nhưng tôi vẫn gặp lỗi. Bạn có thể vui lòng đọc câu hỏi của tôi stackoverflow.com/questions/50189732
bibscy,

5

Các giải pháp được chấp nhận bởi Jeetendra Choudhary works.Although trong Xcode 8 với Swift 3, tôi nhận thấy rằng nó tạo ra một cảnh báo: Instance method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' nearly matches optional requirement 'imagePickerController(_:didFinishPickingMediaWithInfo:)' of protocol 'UIImagePickerControllerDelegate'

nhập mô tả hình ảnh ở đây

và gợi ý thêm @nonobjc hoặc từ khóa riêng tư để tắt tiếng cảnh báo. Nếu bạn tắt tiếng cảnh báo bằng các đề xuất này, giải pháp không còn hoạt động nữa.


Cảm ơn đã làm rõ có ý nghĩa.
Jeet

1
Vấn đề là "AnyObject" - chữ ký Swift 3 chính xác sử dụng "Any". Không sử dụng các giải pháp do Xcode đề xuất để tắt tiếng cảnh báo.
Zig

5

Tôi thấy các hình ảnh mặc định trong thư viện ảnh có thể gây ra sự cố này. Nếu bạn kéo một hình ảnh từ máy tính của bạn vào trình mô phỏng và chọn nó. vấn đề này đã được giải quyết


3

Theo câu trả lời của Abdurohman, tôi thay đổi mã của mình và giải quyết vấn đề, cảm ơn.

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

Đó là mã duy nhất phù hợp với tôi trong Swift 3.0. Cảm ơn!
fraxool

2

Thêm cái này vào viewDidload ()

imagepicker.delegate = self

1

Thêm "_" trong các tham số của hàm.

từ

func imagePickerController(picker: UIImagePickerController ...

đến

func imagePickerController(_ picker: UIImagePickerController ...

1

Điều này đã làm việc cho tôi:

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

Chào mừng bạn đến với Stack Overflow! Các câu trả lời chỉ có mã không hữu ích cho chính chúng. Nó sẽ giúp đỡ nếu bạn có thể thêm một số chi tiết giải thích như thế nào / tại sao nó trả lời câu hỏi
Jeet

1

Nếu điều này giúp ích cho bất kỳ ai, tôi đã gặp phải trường hợp này khi tôi phân lớp UIImageView để tạo chế độ xem tròn. Nó cũng xảy ra khi tôi thêm dòng bên dưới trong viewDidLoad ()

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

Tôi đã thêm dòng trong viewWillLayoutSubViews và nó hoạt động. Xem cái này để biết thêm chi tiết:

clipsToBounds khiến UIImage không hiển thị trong 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
Chào mừng bạn đến với Stack Overflow! Các câu trả lời chỉ có mã không hữu ích cho chính chúng. Sẽ hữu ích nếu bạn có thể thêm một số chi tiết giải thích cách / lý do nó trả lời câu hỏi.
SiHa

2
Điều này đã giải quyết vấn đề của tôi. Nhưng bạn có thể giải thích lý do?
Krishnadas PC

1

Thay đổi didFinishPickingMediaWithInfo info: [String : AnyObject], thànhdidFinishPickingMediaWithInfo info: [String : Any]


1

Đối với Xcode 8.1 với swift 3, Sau khi thay đổi phương thức ủy quyền như bên dưới

thay đổi của bạn

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

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

chức năng

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

    {


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

}

Tôi quên thêm UINavigationControllerDelegate cùng với UIImagePickerControllerDelegate trong

class ViewController:UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate

Bạn sẽ thêm một biến ngay từ đầu như

var imagePicker = UIImagePickerController ()

và đặt ủy quyền và gọi một hàm trong viewdidload () dưới dạng

 imagePicker.delegate = self
 viwImagePick()

Sau đó, giải thích chức năng đó như

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


        }
    }

Bây giờ hình ảnh được thêm vào chế độ xem hình ảnh từ thư viện


Vui lòng chỉnh sửa câu trả lời để giải thích điều này có liên quan như thế nào đến câu hỏi thực tế. Nó không phải là hoàn toàn rõ ràng từ giải thích của bạn.
Jeet

1

Tôi nghĩ rằng bạn đang thiếu kết nối giữa photoImageView và hình ảnh.

Hãy xem ảnh chụp màn hình của tôi bên dưới:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


Tại sao 2 câu trả lời với nội dung giống nhau?
पवन

1

Tôi nghĩ rằng bạn đang thiếu kết nối giữa photoImageView và hình ảnh.

Hãy xem ảnh chụp màn hình của tôi bên dưới:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Chúc may mắn!


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

Hãy chắc chắn bao gồm cả UINavigationControllerDelegateđại biểu. Điều này đã giải quyết vấn đề cho tôi.


0

thử bên dưới

    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

Điều này đã làm việc cho tôi. Chỉ cần sao chép và dán chính xác.

    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
Chào mừng bạn đến với Stack Overflow! Các câu trả lời chỉ có mã không hữu ích cho chính chúng. Nó sẽ giúp đỡ nếu bạn có thể thêm một số chi tiết giải thích như thế nào / tại sao nó trả lời câu hỏi
Jeet

0

Những gì tôi đã làm là khi tôi nhận được hình ảnh từ didFinishPickingMediaWithInfo, tôi đã gọi:

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
}

để lưu nó ở định dạng NSData.

Bảng điều khiển vẫn cảnh báo tôi về "[Chung] Tạo định dạng hình ảnh với loại không xác định là một lỗi" nhưng ít nhất imageView của tôi được cập nhật lên hình ảnh đã chọn thay vì hiển thị hình ảnh trước đó từ viewDidLoad.


0

// bộ chọn hình ảnh với lớp xem bộ sưu tập 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

Đối với tôi, tôi đã nhận được lỗi:

"lỗi nghiêm trọng: không tìm thấy bất ngờ ..."

khi bạn chọn trình chọn hình ảnh imagein.

Để giải quyết vấn đề, tôi đã tạo lại ổ cắm cho máy imageView.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.