webentwicklung-frage-antwort-db.com.de

Wie kann ich den Namen des Bildes über die Fotobibliothek im iPhone auswählen?

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.

23
Sandeep Singh

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

  1. Wählen Sie im Projektnavigator Ihr Projekt aus
  2. Wählen Sie Ihr Ziel aus
  3. Wählen Sie die Registerkarte "Erstellungsphasen"
  4. Öffnen Sie den Expander 'Link Binaries With Libraries'
  5. Klicken Sie auf die Schaltfläche "+"
  6. Wählen Sie Ihren Rahmen aus
  7. (optional) Ziehen Sie das hinzugefügte Framework per Drag & Drop in die Gruppe 'Frameworks'

Quelle: http://www.raywenderlich.com/forums/viewtopic.php?f=2&p=34901 & Wie kann man in Xcode 4 "vorhandene Frameworks hinzufügen"?

67
Joanne

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".

8
parag

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];
5
Heiko Hoffmann

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.

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

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];
}
0
Ispas Claudiu

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.

0
Vitalii