Как я могу получить имя изображения, выбранного через библиотеку фотографий в iphone? - PullRequest
23 голосов
/ 30 ноября 2010

Я выбираю изображение из библиотеки фотографий в приложении iphone.Как я получу фактическое имя изображения.

в .h классе

UIImageView * imageView;

UIButton * choosePhotoBtn;

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

Как мне получить фактическое имя изображения?

Я новичок в iphone.Пожалуйста, помогите мне.

Заранее спасибо.

Ответы [ 9 ]

68 голосов
/ 24 апреля 2013

import AssetsLibrary в вашем файле:

#import <AssetsLibrary/AssetsLibrary.h>

И, в - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

положить

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

, чтобы вы получили имя изображения в журнале.

* не забудьте добавить существующий фреймворк: AssetsLibrary.framework Шаги:

  1. В навигаторе проекта выберите ваш проект
  2. Выберите цель
  3. Выберите вкладку «Фазы сборки»
  4. Открыть «Двоичные файлы ссылок с библиотеками»
  5. Нажмите кнопку «+»
  6. Выберите каркас
  7. (необязательно) Перетащите добавленный каркас в группу 'Frameworks'

Источник: http://www.raywenderlich.com/forums/viewtopic.php?f=2&p=34901 & Как «добавить существующие каркасы» в Xcode 4?

9 голосов
/ 13 апреля 2016

Если вы создаете для iOS 9+ target, вы увидите кучу предупреждений об устаревании с ALAssetsLibrary, т. Е .:

'assetForURL (_: resultBlock: failBlock :)' устарел в iOS 9.0: используйте fetchAssetsWithLocalIdentifiers: options: в PHAsset для извлечения ресурсов по локальному идентификатору (или для поиска PHAssets по ранее известному ALAssetPropertyAssetURL используйте fetchAssetsWithALAssetURLs: параметры :) Фото рамки вместо

Как описано в предупреждении, вы должны использовать PHAsset. Например, при использовании swift 2.x вам сначала нужно добавить import Photos в ваш файл. Затем в методе didFinishPickingMediaWithInfo UIImagePickerControllerDelegate используйте fetchAssetsWithALAssetURLs, чтобы получить имя файла:

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

Это установит для filename что-то вроде "IMG_0007.JPG".

5 голосов
/ 13 августа 2016

В Objective C используйте каркас Фотографии и импортируйте Photos / Photos.h

Затем в вашей функции imagePickerController добавьте следующее, чтобы получить имя файла изображения из библиотеки фотографий

NSURL *refURL = [info valueForKey:UIImagePickerControllerReferenceURL];
PHFetchResult *result = [PHAsset fetchAssetsWithALAssetURLs:@[refURL] options:nil];
NSString *filename = [[result firstObject] filename];
5 голосов
/ 04 декабря 2015

Простая реализация 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)
        }
    }
}

Помните о: import AssetsLibrary

2 голосов
/ 27 июня 2012

Хотя вы можете получить последний компонент пути и использовать его как имя файла, делать это не рекомендуется.Эти имена файлов присваиваются системой, чтобы iTunes понимал их при синхронизации, и не предназначены для доступа программистов, так как они могут быть заменены некоторыми другими изображениями в будущих синхронизациях.

Хорошим способом для этого является назначениетекущая дата в качестве имени файла, при сохранении в изображения, выбранные из галереи.Вы можете сохранить его в своем каталоге документов или библиотеки и использовать файл PList для сопоставления изображений с их именами файлов.

В качестве альтернативы, вы также можете назначать уникальные номера в качестве имен файлов и получать доступ к изображениям, используя эти значения.

0 голосов
/ 10 мая 2018
 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 голосов
/ 29 января 2018
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 голосов
/ 25 мая 2017

Цель C реализация, которая работает на iOS 10 . ALAssetsLibrary устарела, поэтому вам следует использовать 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 голосов
/ 13 января 2017

Начиная с Swift 3 и iOS8 + .filename больше не доступен.Он все еще доступен через self.valueForKey ("имя файла"), но не совсем законно.

Однако я нашел этот ответ в вопросе "iOS8 Photos Framework: Какполучить имя (или имя файла) PHAsset? " чтобы быть кратким, простым и легальным.

...