ver puedo pasar para las importar fotos descargar activadas ios objective-c iphone uiimagepickercontroller

ios - pasar - ¿Cómo puedo obtener el nombre de la imagen seleccionada a través de la biblioteca de fotos en el iPhone?



no puedo ver las fotos de mi iphone en mi pc (9)

A partir de Swift 3 e iOS8 + ya no se puede acceder al .filename. Todavía está disponible a través de self.valueForKey ("nombre de archivo"), pero no del todo legal.

Sin embargo, encontré esta respuesta en la pregunta "iOS8 Photos Framework: ¿Cómo obtener el nombre (o nombre de archivo) de un PHAsset?" ser breve, simple y legal.

Estoy recogiendo una imagen de la biblioteca de fotos en la aplicación de iPhone. ¿Cómo recuperaré el nombre de la imagen real?

en la clase .h

UIImageView * imageView; UIButton * choosePhotoBtn;

en la clase .m

-(IBAction) getPhoto:(id) sender { UIImagePickerController * picker = [[UIImagePickerController alloc] init]; picker.delegate = self; if((UIButton *) sender == choosePhotoBtn) { picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; } else { picker.sourceType = UIImagePickerControllerSourceTypeCamera; } [self presentModalViewController:picker animated:YES]; } - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { [picker dismissModalViewControllerAnimated:YES]; imageView.image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; }

¿Cómo obtendré el nombre real de la imagen?

Soy nuevo en el iphone. Por favor, ayúdame.

Gracias por adelantado.


Aunque es posible que pueda recuperar el último componente de ruta y usarlo como un nombre de archivo, no es aconsejable hacerlo. El sistema asigna estos nombres de archivos para que iTunes entiendan mientras se sincronizan y no están destinados a que accedan los programadores, ya que podrían ser reemplazados por otras imágenes en sincronizaciones futuras.

Una buena ronda para esto es asignar la Fecha actual como nombres de archivo, mientras se guarda a las imágenes seleccionadas de la galería. Puede guardarlo en sus documentos o en el directorio de la biblioteca y usar un archivo PList de mapeo para mapear imágenes a su nombre de archivo.

Alternativamente, también puede asignar números únicos como nombres de archivo y acceder a las imágenes usando estos valores.


En Objective C, utiliza el marco de Photos e importa Photos / Photos.h

Luego, en su función imagePickerController agregue lo siguiente para obtener el nombre de archivo de la imagen de la biblioteca de fotos

NSURL *refURL = [info valueForKey:UIImagePickerControllerReferenceURL]; PHFetchResult *result = [PHAsset fetchAssetsWithALAssetURLs:@[refURL] options:nil]; NSString *filename = [[result firstObject] filename];


Implementación Simple Swift:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { if let referenceUrl = info[UIImagePickerControllerReferenceURL] as? NSURL { ALAssetsLibrary().assetForURL(referenceUrl, resultBlock: { asset in let fileName = asset.defaultRepresentation().filename() //do whatever with your file name }, failureBlock: nil) } } }

Recuerde acerca de: import AssetsLibrary


Implementación de Objective C que funciona en iOS 10 . ALAssetsLibrary parece estar en desuso por lo que debe usar PHAsset:

-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{ NSURL *imageURL = [info valueForKey:UIImagePickerControllerReferenceURL]; PHAsset *phAsset = [[PHAsset fetchAssetsWithALAssetURLs:@[imageURL] options:nil] lastObject]; NSString *imageName = [phAsset valueForKey:@"filename"]; UIImage *photo = [info valueForKey:UIImagePickerControllerOriginalImage]; NSLog(@"Picked image: %@ width: %f x height: %f",imageName, photo.size.width, photo.size.height); [picker dismissViewControllerAnimated:YES completion:nil]; }


Si está compilando para el destino iOS 9+, verá un montón de advertencias de desactivación con ALAssetsLibrary, es decir:

''assetForURL (_: resultBlock: failureBlock :)'' quedó en desuso en iOS 9.0: Use fetchAssetsWithLocalIdentifiers: options: en PHAsset para buscar activos por identificador local (o para buscar PHAssets por un ALAssetPropertyAssetURL previamente conocido use fetchAssetsWithALAssetURLs: options :) del marco de Fotos en lugar

Como se describe en la advertencia, debe usar PHAsset. Usando swift 2.x, por ejemplo, primero tendrá que agregar import Photos a su archivo. Luego, en el método didFinishPickingMediaWithInfo UIImagePickerControllerDelegate, use fetchAssetsWithALAssetURLs para obtener el nombre del archivo:

if let imageURL = info[UIImagePickerControllerReferenceURL] as? NSURL { let result = PHAsset.fetchAssetsWithALAssetURLs([imageURL], options: nil) let filename = result.firstObject?.filename ?? "" }

Esto configurará el filename de filename para que sea algo así como, "IMG_0007.JPG".


importa AssetsLibrary en tu archivo:

#import <AssetsLibrary/AssetsLibrary.h>

Y, en - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

poner

// get the ref url NSURL *refURL = [info valueForKey:UIImagePickerControllerReferenceURL]; // define the block to call when we get the asset based on the url (below) ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *imageAsset) { ALAssetRepresentation *imageRep = [imageAsset defaultRepresentation]; NSLog(@"[imageRep filename] : %@", [imageRep filename]); }; // get the asset library and fetch the asset based on the ref url (pass in block above) ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init]; [assetslibrary assetForURL:refURL resultBlock:resultblock failureBlock:nil];

por lo que obtendrás el nombre de la imagen en el registro.

* no olvide agregar el marco existente: AssetsLibrary.framework Pasos:

  1. En el navegador del proyecto, selecciona tu proyecto
  2. Selecciona tu objetivo
  3. Seleccione la pestaña ''Crear fases''
  4. Abrir el binario ''Enlace Binarios con bibliotecas''
  5. Haga clic en el botón ''+''
  6. Seleccione su marco
  7. (opcional) Arrastre y suelte el marco agregado al grupo ''Frameworks''

Fuente: http://www.raywenderlich.com/forums/viewtopic.php?f=2&p=34901 & ¿Cómo "agregar marcos existentes" en Xcode 4?


var fileName: String = "Attachment" if let imageURL = info[UIImagePickerControllerReferenceURL] as? URL { let assets = PHAsset.fetchAssets(withALAssetURLs: [imageURL], options: nil) let assetResource = PHAssetResource.assetResources(for: assets.firstObject!) fileName = assetResource.first?.originalFilename ?? "Attachment" } print(fileName)


func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { let imageUrl = info[UIImagePickerControllerReferenceURL] as! NSURL let imageName = imageUrl.lastPathComponent let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! let photoURL = NSURL(fileURLWithPath: documentDirectory) let localPath = photoURL.appendingPathComponent(imageName!) let image = info[UIImagePickerControllerOriginalImage]as! UIImage let data = UIImagePNGRepresentation(image) do { try data?.write(to: localPath!, options: Data.WritingOptions.atomic) } catch { // Catch exception here and act accordingly } self.dismiss(animated: true, completion: nil); }