Ich wähle ein Bild aus der Foto-Bibliothek in der iPhone-Anwendung aus. Wie erhalte ich den tatsächlichen Bildnamen?.
in .h Klasse
UIImageView * imageView;
UIButton * choosePhotoBtn;
in .m Klasse
-(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"];
}
Wie bekomme ich den tatsächlichen Namen des Bildes?
Ich bin neu in iPhone. Bitte hilf mir.
Danke im Voraus.
importieren Sie AssetsLibrary in Ihre Datei:
#import <AssetsLibrary/AssetsLibrary.h>
Und in - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
stellen
// 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];
so erhalten Sie den Namen des Bildes im Protokoll.
* Vergessen Sie nicht, ein bestehendes Framework hinzuzufügen: AssetsLibrary.framework
Quelle: http://www.raywenderlich.com/forums/viewtopic.php?f=2&p=34901 & Wie kann man in Xcode 4 "vorhandene Frameworks hinzufügen"?
Wenn Sie ein Ziel für iOS 9+ erstellen, werden mit ALAssetsLibrary eine Reihe von Warnungen zur Abwertung angezeigt, d. H .:
'assetForURL (_: resultBlock: failureBlock :)' wurde in iOS 9.0 nicht mehr empfohlen: Verwenden Sie fetchAssetsWithLocalIdentifiers: options: bei PHAsset, um Assets nach lokalem Bezeichner abzurufen (oder um nach PHAssets über eine zuvor bekannte ALAssetPropertyAssetURL-Datei zu suchen stattdessen
Wie in der Warnung beschrieben, sollten Sie PHAsset verwenden. Bei Verwendung von Swift 2.x müssen Sie beispielsweise import Photos
zu Ihrer Datei hinzufügen. Verwenden Sie dann in der UIImagePickerControllerDelegate-Methode didFinishPickingMediaWithInfo
die Variable fetchAssetsWithALAssetURLs
, um den Dateinamen abzurufen:
if let imageURL = info[UIImagePickerControllerReferenceURL] as? NSURL {
let result = PHAsset.fetchAssetsWithALAssetURLs([imageURL], options: nil)
let filename = result.firstObject?.filename ?? ""
}
Dies setzt filename
auf "IMG_0007.JPG".
Einfache Swift-Implementierung:
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)
}
}
}
Denken Sie daran: import AssetsLibrary
Verwenden Sie in Objective C das Framework Photos und importieren Sie Photos/Photos.h
Fügen Sie dann in Ihrer imagePickerController-Funktion Folgendes hinzu, um den Dateinamen des Bildes aus der Fotobibliothek zu erhalten
NSURL *refURL = [info valueForKey:UIImagePickerControllerReferenceURL];
PHFetchResult *result = [PHAsset fetchAssetsWithALAssetURLs:@[refURL] options:nil];
NSString *filename = [[result firstObject] filename];
Sie können zwar die letzte Pfadkomponente abrufen und wie einen Dateinamen verwenden, dies wird jedoch nicht empfohlen. Diese Dateinamen werden vom System für iTunes zum Verständnis während der Synchronisierung zugewiesen und sind nicht für Programmierer zum Zugriff gedacht, da sie bei zukünftigen Synchronisierungen durch andere Bilder ersetzt werden könnten.
Eine gute Runde ist es, das aktuelle Datum als Dateinamen zuzuweisen und gleichzeitig Bilder aus der Galerie zu speichern. Sie können es in Ihrem Dokumenten- oder Bibliotheksverzeichnis speichern und eine Zuordnungs-PList-Datei verwenden, um Bilder zu ihrem Dateinamen zuzuordnen.
Alternativ können Sie auch eindeutige Nummern als Dateinamen vergeben und mit diesen Werten auf die Bilder zugreifen.
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)
Ziel C Implementierung, die auf iOS 10 funktioniert. ALAssetsLibrary scheint veraltet zu sein, daher sollten Sie PHAsset verwenden:
-(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];
}
Ab Swift 3 und iOS8 + ist der Dateiname nicht mehr verfügbar. Es ist immer noch über self.valueForKey ("Dateiname") verfügbar, jedoch nicht ganz legal.
Ich fand jedoch diese Antwort in der Frage "iOS8 Photos Framework: Wie bekomme ich den Namen (oder Dateinamen) eines PHAsset?" kurz, einfach und legal sein.