web-dev-qa-db-fra.com

Comment puis-je obtenir le nom de l'image choisie par la photothèque dans l'iphone?

Je choisis une image de la photothèque dans l'application iphone. Comment vais-je récupérer le nom de l'image réelle.

en classe .h

UIImageView * imageView;

UIButton * choosePhotoBtn;

en classe .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"];
}

Comment vais-je obtenir le nom réel de l'image?

Je suis nouveau dans l'iphone. Aidez-moi, s'il vous plaît.

Merci d'avance.

23
Sandeep Singh

importer AssetsLibrary dans votre fichier:

#import <AssetsLibrary/AssetsLibrary.h>

Et, dans - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

mettre

// 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];

ainsi vous obtiendrez le nom de l'image dans le journal.

* N'oubliez pas d'ajouter le framework existant: AssetsLibrary.framework Etapes:

  1. Dans le navigateur de projet, sélectionnez votre projet.
  2. Sélectionnez votre cible
  3. Sélectionnez l'onglet 'Build Phases'
  4. Ouvrez le module d'extension 'Link Binaries With Libraries'
  5. Cliquez sur le bouton '+'
  6. Sélectionnez votre cadre
  7. (facultatif) Faites glisser le cadre ajouté dans le groupe "Frameworks".

Source: http://www.raywenderlich.com/forums/viewtopic.php?f=2&p=34901 & Comment "ajouter des frameworks existants" dans Xcode 4?

67
Joanne

Si vous construisez pour iOS 9+ cible, vous verrez beaucoup d’avertissements de dépréciation avec ALAssetsLibrary, c’est-à-dire:

'assetForURL (_: resultBlock: failureBlock :)' était obsolète dans iOS 9.0: Utilisez fetchAssetsWithLocalIdentifiers: options: sur PHAsset pour extraire des actifs par identificateur local (ou pour rechercher des PHAssets par un utilisateur connu antérieurement de ALAssetPropertyAssetURL au lieu

Comme décrit dans l'avertissement, vous devez utiliser PHAsset. En utilisant Swift 2.x, par exemple, vous devrez d’abord ajouter import Photos à votre fichier. Ensuite, dans la méthode didFinishPickingMediaWithInfoUIImagePickerControllerDelegate, utilisez fetchAssetsWithALAssetURLs pour obtenir le nom de fichier:

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

Ceci va définir filename comme quelque chose comme "IMG_0007.JPG".

8
parag

Implémentation Swift simple:

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

Rappelez-vous à propos de: import AssetsLibrary

5

Dans Objective C, utilisez le framework Photos et importez Photos/Photos.h

Ensuite, dans votre fonction imagePickerController Ajoutez ce qui suit pour obtenir le nom de fichier de l'image à partir de la photothèque

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

Bien que vous puissiez peut-être récupérer le dernier composant de chemin et l'utiliser comme un nom de fichier, il est déconseillé de le faire. Ces noms de fichiers sont attribués par le système pour que iTunes les comprenne lors de la synchronisation et ne soient pas destinés aux programmeurs car ils pourraient être remplacés par d'autres images lors de futures synchronisations.

Une bonne solution consiste à attribuer à la Date actuelle le nom de fichier, tout en enregistrant les images sélectionnées dans la galerie. Vous pouvez l’enregistrer dans votre répertoire de documents ou votre bibliothèque et utiliser un fichier PList de mappage pour mapper des images sur leur nom de fichier.

Vous pouvez également affecter des numéros uniques comme noms de fichiers et accéder aux images à l'aide de ces valeurs.

2
Shyam Bhat
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);
}
0
Sami Youssef
 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)
0
Kiran S

Objectif C implémentation qui fonctionne sur iOS 10 . ALAssetsLibrary semble être obsolète, vous devriez donc utiliser 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];
}
0
Ispas Claudiu

À partir de Swift 3 et iOS8 +, le nom de fichier .fil n'est plus accessible. Il est toujours disponible via self.valueForKey ("nom de fichier"), mais pas tout à fait légal.

Cependant, j'ai trouvé cette réponse dans la question "Cadre iOS8 Photos: comment obtenir le nom (ou le nom du fichier) d'un PHAsset?" être court, simple et légal.

0
Vitalii