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で変更されたかどうか、またはこれを行う他の方法があるかどうかを知るには、ヘルプまたは提案が必要です。
以下のコードは私のために問題を解決しました-
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)
}
自分にデリゲートを追加することを忘れないでください
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 Choudhary は動作しますが、Xcode 8ではSwift 3を使用していますが、警告が生成されることに気付きました:Instance method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' nearly matches optional requirement 'imagePickerController(_:didFinishPickingMediaWithInfo:)' of protocol 'UIImagePickerControllerDelegate'
@ nonobjcまたはprivateキーワードを追加して警告を消すことを提案しますこれらの提案を使用して警告を消すと、ソリューションは機能しなくなります。
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, didFinishPickingMediaWithInfo info: [String : Any]) {
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
imageView.image = image
self.dismiss(animated: true, completion: nil)
}
}
didFinishPickingMediaWithInfo info: [String : AnyObject]
をdidFinishPickingMediaWithInfo info: [String : Any]
に変更します
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)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let image = info[UIImagePickerControllerOriginalImage] as? UIImage
self.dismiss(animated: true, completion: nil)
self.imageTook.image = image
}
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)
}
}
これで、ライブラリから画像ビューに画像が追加されました
関数パラメーターに「_」を追加します。
から
func imagePickerController(picker: UIImagePickerController ...
に
func imagePickerController(_ picker: UIImagePickerController ...
これが誰にも役立つ場合、UIImageViewをサブクラス化して丸みのあるビューを作成すると、これが起こりました。また、viewDidLoad()に次の行を追加したときにも発生しました。
imageView.layer.cornerRadius = self.imageView.frame.size.width / 2
最終的に、viewWillLayoutSubViewsに行を追加し、機能しました。詳細はこちらをご覧ください:
これは私のために働いた。正確にコピーして貼り付けてください。
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)
}
//コレクションビュークラス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
}
TheUINavigationControllerDelegate
デリゲートも必ず含めてください。これで問題は解決しました。
以下を試してください
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
}
私がしたことは、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の前の画像を表示するのではなく、選択した画像に更新されます。