ios - que - "Crear un formato de imagen con un tipo desconocido es un error" con UIImagePickerController
png o jpg para fotos (23)
// selector de imágenes con la clase de vista de colección 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
}
Al elegir una imagen del selector de imágenes en iOS 10 Swift 3 recibo un error:
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)
}
La imagen no se está seleccionando y actualizando. Necesito ayuda o sugerencia para saber si la sintaxis o algo relacionado con este método ha cambiado en iOS10 o Swift 3 o si hay alguna otra forma de hacerlo.
Agregue "_" en los parámetros de la función.
desde
func imagePickerController(picker: UIImagePickerController ...
a
func imagePickerController(_ picker: UIImagePickerController ...
Agregue esto para verDidload ()
imagepicker.delegate = self
Asegúrese de incluir también el delegado
UINavigationControllerDelegate
.
Esto resolvió el problema para mí.
Cambie la
didFinishPickingMediaWithInfo info: [String : AnyObject]
, a
didFinishPickingMediaWithInfo info: [String : Any]
El código mencionado a continuación resolvió el problema para mí:
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)
}
El siguiente código resolvió el problema:
Si el usuario realiza cambios en la imagen seleccionada, extraiga solo esa imagen; de lo contrario, extraiga la fuente de imagen original sin ningún cambio y finalmente descarte el controlador de vista del selector de imágenes.
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)
}
Encontré que las imágenes predeterminadas en la biblioteca de fotos podrían causar este problema. Si arrastra una imagen de su computadora al simulador y la elige. este problema está resuelto
Esto funcionó para mí. Simplemente cópielo y péguelo exactamente.
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)
}
Esto funcionó para mí:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
imageView.image = image
self.dismiss(animated: true, completion: nil)
}
}
La
solución aceptada
por
Jeetendra Choudhary funciona.
Aunque en Xcode 8 con Swift 3, noté que genera una advertencia: el
Instance method ''imagePickerController(_:didFinishPickingMediaWithInfo:)'' nearly matches optional requirement ''imagePickerController(_:didFinishPickingMediaWithInfo:)'' of protocol ''UIImagePickerControllerDelegate''
y sugiere agregar @nonobjc o una palabra clave privada para silenciar la advertencia. Si silencia la advertencia utilizando estas sugerencias, la solución ya no funcionará.
Lo que hice fue que una vez que obtuve la imagen de didFinishPickingMediaWithInfo, llamé:
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
}
para guardarlo en formato NSData.
La consola todavía me advirtió sobre "[Genérico] Crear un formato de imagen con un tipo desconocido es un error" pero al menos mi imageView se actualiza a la imagen seleccionada en lugar de mostrar la anterior desde viewDidLoad.
Para Xcode 8.1 con swift 3, después de cambiar el método de delegado como se muestra a continuación
cambia tu
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
imagePost.image = image
self.dismiss(animated: true, completion: nil)
}
funcionar para
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{
imagePost.image = info[UIImagePickerControllerOriginalImage] as? UIImage
picker.dismiss(animated: true, completion: nil)
}
Olvidé agregar UINavigationControllerDelegate junto con UIImagePickerControllerDelegate en
class ViewController:UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate
Habría agregado una variable al principio como
var imagePicker = UIImagePickerController ()
y establecer delegado y llamar a una función en viewdidload () como
imagePicker.delegate = self
viwImagePick()
Luego explique esa función como
//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)
}
}
Ahora la imagen se agrega a la vista de imagen desde la biblioteca
Para mí recibía el error:
"error fatal: inesperadamente encontrado nulo ..."
cuando selecciona imagein imagepicker.
Para solucionar el problema, volví a crear la salida para
imageView
.
Recuerde agregar delegado a sí mismo
let picker = UIImagePickerController()
picker.delegate = self // delegate added
Según la respuesta de Abdurohman, cambio mi código y resuelvo el problema, gracias.
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)
}
Si esto ayuda a alguien, esto sucedió cuando subclasifiqué UIImageView para crear una vista redondeada. También sucedió cuando agregué la siguiente línea en viewDidLoad ()
imageView.layer.cornerRadius = self.imageView.frame.size.width / 2
Terminé agregando la línea en viewWillLayoutSubViews y funcionó. Vea esto para más detalles:
clipsToBounds hace que UIImage no se muestre en iOS10 y XCode 8
Si permite la edición de la imagen
imageController.allowsEditing = true
deberá obtener la imagen editada:
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
}
}
prueba a continuación
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]) {
let image = info[UIImagePickerControllerOriginalImage] as? UIImage
self.dismiss(animated: true, completion: nil)
self.imageTook.image = image
}
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)
}