web-dev-qa-db-ja.com

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で変更されたかどうか、またはこれを行う他の方法があるかどうかを知るには、ヘルプまたは提案が必要です。

76
Jeet

以下のコードは私のために問題を解決しました-

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

自分にデリゲートを追加することを忘れないでください

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

以下のコードは問題を解決しました:

ユーザーが選択した画像に変更を加えた場合、その画像のみをプルします。それ以外の場合は、変更せずに元の画像ソースをプルし、最終的に画像ピッカービューコントローラを閉じます。

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

ピクチャ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
    }
}
7
oyalhi

写真ライブラリのデフォルトの画像がこの問題を引き起こす可能性があることがわかりました。コンピューターからシミュレーターに画像をドラッグして選択した場合。この問題は解決されました

5
changmeng chen

受け入れられた解決策 by Jeetendra Choudhary は動作しますが、Xcode 8ではSwift 3を使用していますが、警告が生成されることに気付きました:Instance method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' nearly matches optional requirement 'imagePickerController(_:didFinishPickingMediaWithInfo:)' of protocol 'UIImagePickerControllerDelegate'

enter image description here

@ nonobjcまたはprivateキーワードを追加して警告を消すことを提案しますこれらの提案を使用して警告を消すと、ソリューションは機能しなくなります。

5
Ashildr

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

これをviewDidload()に追加します

imagepicker.delegate = self
2
Ali Adil

PhotoImageViewと画像の間の接続が欠落していると思います。

以下のスクリーンショットをご覧ください。

enter image description here

enter image description here

1
My Mai

これは私のために働いた:

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

PhotoImageViewと画像の間の接続が欠落していると思います。

以下のスクリーンショットをご覧ください。

enter image description here

enter image description here

がんばろう!

1
My Mai

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

Swift 3を使用するXcode 8.1の場合、デリゲートメソッドを次のように変更した後

あなたを変える

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)

}

UIImagePickerControllerDelegateとともにUINavigationControllerDelegateを追加するのを忘れた

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
Dinesh Kumar

関数パラメーターに「_」を追加します。

から

func imagePickerController(picker: UIImagePickerController ...

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

これが誰にも役立つ場合、UIImageViewをサブクラス化して丸みのあるビューを作成すると、これが起こりました。また、viewDidLoad()に次の行を追加したときにも発生しました。

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

最終的に、viewWillLayoutSubViewsに行を追加し、機能しました。詳細はこちらをご覧ください:

clipsToBoundsにより、UIImageはiOS10およびXCode 8に表示されません

1
crims345

これは私のために働いた。正確にコピーして貼り付けてください。

    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

//コレクションビュークラス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

TheUINavigationControllerDelegateデリゲートも必ず含めてください。これで問題は解決しました。

0
Jordi Bruin

以下を試してください

    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

私がしたことは、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の前の画像を表示するのではなく、選択した画像に更新されます。

0
Jackson Gan