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.
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:
Source: http://www.raywenderlich.com/forums/viewtopic.php?f=2&p=34901 & Comment "ajouter des frameworks existants" dans Xcode 4?
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 didFinishPickingMediaWithInfo
UIImagePickerControllerDelegate, 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".
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
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];
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.
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);
}
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)
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];
}
À 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.